<!DOCTYPE html>
<!-- saved from url=(0046)https://zhuanlan.zhihu.com/p/66984738?utm_id=0 -->
<html class="itcauecng" data-hairline="true" data-rh="data-theme" data-theme="light" lang="zh" style="">
<head>
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
    <title>mybatis 3.x源码深度解析（五） - 知乎</title>
    <meta content="width=device-width,initial-scale=1,maximum-scale=1" name="viewport">
    <meta content="webkit" name="renderer">
    <meta content="webkit" name="force-rendering">
    <meta content="IE=10,chrome=1" http-equiv="X-UA-Compatible">
    <meta content="FTeR0c8arOPKh8c5DYh_9uu98_zJbaWw53J-Sch9MTg" name="google-site-verification">
    <meta content="Java 编程,MyBatis,Java 程序员" data-rh="true" name="keywords">
    <meta content="3 关键对象总结与回顾3.1 SqlSourceSqlSource是XML文件或者注解方法中映射语句的实现时表示，通过SqlSourceBuilder.parse()方法创建，SqlSourceBuilder中符号解析器将mybatis中的查询参数#{}转换为?，并记录了参数…" data-rh="true" name="description">
    <meta content="mybatis 3.x源码深度解析（五）" data-rh="true" property="og:title">
    <meta content="https://zhuanlan.zhihu.com/p/66984738" data-rh="true" property="og:url">
    <meta content="3 关键对象总结与回顾3.1 SqlSourceSqlSource是XML文件或者注解方法中映射语句的实现时表示，通过SqlSourceBuilder.parse()方法创建，SqlSourceBuilder中符号解析器将mybatis中的查询参数#{}转换为?，并记录了参数…" data-rh="true" property="og:description">
    <meta content="" data-rh="true" property="og:image">
    <meta content="article" data-rh="true" property="og:type">
    <meta content="知乎专栏" data-rh="true" property="og:site_name">
    <link data-rh="true" href="https://static.zhihu.com/heifetz/assets/apple-touch-icon-152.81060cab.png" rel="apple-touch-icon">
    <link data-rh="true" href="https://static.zhihu.com/heifetz/assets/apple-touch-icon-152.81060cab.png" rel="apple-touch-icon" sizes="152x152">
    <link data-rh="true" href="https://static.zhihu.com/heifetz/assets/apple-touch-icon-120.d5793cac.png" rel="apple-touch-icon" sizes="120x120">
    <link data-rh="true" href="https://static.zhihu.com/heifetz/assets/apple-touch-icon-76.7abf3393.png" rel="apple-touch-icon" sizes="76x76">
    <link data-rh="true" href="https://static.zhihu.com/heifetz/assets/apple-touch-icon-60.362a8eac.png" rel="apple-touch-icon" sizes="60x60">
    <link crossorigin="" href="https://static.zhihu.com/heifetz/favicon.ico" rel="shortcut icon" type="image/x-icon">
    <link crossorigin="" href="https://static.zhihu.com/heifetz/search.xml" rel="search" title="知乎" type="application/opensearchdescription+xml">
    <link href="https://static.zhimg.com/" rel="dns-prefetch">
    <link href="https://pica.zhimg.com/" rel="dns-prefetch">
    <link href="https://picx.zhimg.com/" rel="dns-prefetch">
    <link href="https://pic1.zhimg.com/" rel="dns-prefetch">
    <link href="https://pic2.zhimg.com/" rel="dns-prefetch">
    <link href="https://pic3.zhimg.com/" rel="dns-prefetch">
    <link href="https://pic4.zhimg.com/" rel="dns-prefetch">
    <link href="https://static.zhihu.com/" rel="dns-prefetch">
    <script data-web-reporter-config="{&quot;platform&quot;:&quot;web&quot;,&quot;project&quot;:&quot;heifetz&quot;}" nonce="">!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).webReporter={})}(this,function(e){"use strict";var t={},n=!1,o=function(){var e,o,r,a,i;return n||(e=document.querySelector("script[data-web-reporter-config]"),o=e&&e.dataset.webReporterConfig||"{}",r=JSON.parse(o),a=r.platform,i=r.project,t={platform:a,project:i},n=!0),t};function r(e){return a(function(){return localStorage.getItem(e)})()}function a(e){return function(){try{return e.apply(void 0,arguments)}catch(e){}}}var i=a(function(e,t){var n={platform:"web",project:o().project,clientTimestamp:+new Date};!function(e,t,n){"1"===r("weber:logenabled")&&console.log("[web-reporter]%o",{type:e,base:t,data:n})}(e,n,t),function(e,t){var n=btoa(JSON.stringify(t));if("undefined"!=typeof Blob&&window.navigator&&window.navigator.sendBeacon){var o=new Blob([n],{type:"text/plain"});navigator.sendBeacon(e,o)}else{var r=new XMLHttpRequest;r.open("POST",e),r.withCredentials=!1,r.setRequestHeader("Content-Type","text/plain;charset=UTF-8"),r.send(n)}}(r("weber:api")||"https://apm.zhihu.com/collector/web_json",{type:e,base:n,data:t})});e.report=i,Object.defineProperty(e,"__esModule",{value:!0})});


    </script>
    <link crossorigin="" href="./mybatis 3.x源码深度解析（五） - 知乎_files/3978.216a26f4.fad6dc0a28ed704a22b5.css" rel="stylesheet">
    <link crossorigin="" href="./mybatis 3.x源码深度解析（五） - 知乎_files/column.216a26f4.06a472043df1c97c7d7c.css" rel="stylesheet">
    <link crossorigin="anonymous" href="./mybatis 3.x源码深度解析（五） - 知乎_files/user-hover-card.216a26f4.5a144d10fd621116c8d8.css" rel="stylesheet" type="text/css">
    <link crossorigin="anonymous" href="./mybatis 3.x源码深度解析（五） - 知乎_files/GoodsRecommendGoodsCardList.216a26f4.d95ce79191cdf8d7ac28.css" rel="stylesheet" type="text/css">
    <link crossorigin="anonymous" href="./mybatis 3.x源码深度解析（五） - 知乎_files/report_modals.216a26f4.61f4619592d63689f82b.css" rel="stylesheet" type="text/css">
    <link crossorigin="anonymous" href="./mybatis 3.x源码深度解析（五） - 知乎_files/3280.216a26f4.d9c0f602c6ce820e0e87.css" rel="stylesheet" type="text/css">
    <link crossorigin="anonymous" href="./mybatis 3.x源码深度解析（五） - 知乎_files/3433.216a26f4.311fb8a7529aff7e15c0.css" rel="stylesheet" type="text/css">
    <link crossorigin="anonymous" href="./mybatis 3.x源码深度解析（五） - 知乎_files/ECommerceAd.216a26f4.f500eb4c598fc98e44d8.css" rel="stylesheet" type="text/css">
    <link crossorigin="anonymous" href="./mybatis 3.x源码深度解析（五） - 知乎_files/1638.216a26f4.76594024cc8743a166dc.css" rel="stylesheet" type="text/css">
    <link crossorigin="anonymous" href="./mybatis 3.x源码深度解析（五） - 知乎_files/EditableV2.216a26f4.a55e3c94b0693bbe80d6.css" rel="stylesheet" type="text/css">
    <script nonce="">!function(){"use strict";!function(e,n){var r=[];function t(e){return function(){r.push([e,arguments])}}n.Raven={captureException:t("captureException"),captureMessage:t("captureMessage"),captureBreadcrumb:t("captureBreadcrumb")};var a,o,c,i,s,u="undefined"!=typeof DOMError;function d(e){var n=e instanceof Error||e instanceof ErrorEvent||u&&e instanceof DOMError||e instanceof DOMException;Raven.captureException(n?e:new Error(e.message||e.reason))}n.addEventListener("unhandledrejection",d),n.addEventListener("error",d,!0),a=e.src,o=e,c=function(){r.forEach(function(e){var n;(n=Raven)[e[0]].apply(n,e[1])}),n.removeEventListener("unhandledrejection",d),n.removeEventListener("error",d,!0)},i=document.head||document.getElementsByTagName("head")[0],(s=document.createElement("script")).crossOrigin=o.crossOrigin,s.dataset.sentryConfig=o["data-sentry-config"],s.onload=c,s.src=a,i.appendChild(s)}({"defer":true,"crossOrigin":"anonymous","src":"https://unpkg.zhimg.com/@cfe/sentry-script@1.3.1/dist/init.js","data-sentry-config":"{\"dsn\":\"https://2d8d764432cc4f6fb3bc78ab9528299d@crash2.zhihu.com/1224\",\"sampleRate\":0.1,\"release\":\"1099-007593d0\",\"ignoreErrorNames\":[\"NetworkError\",\"SecurityError\"],\"ignoreErrorsPreset\":\"ReactApp\",\"tags\":{\"app_name\":\"heifetz\"}}"},window)}();


    </script>
    <script crossorigin="anonymous" data-sentry-config="{&quot;dsn&quot;:&quot;https://2d8d764432cc4f6fb3bc78ab9528299d@crash2.zhihu.com/1224&quot;,&quot;sampleRate&quot;:0.1,&quot;release&quot;:&quot;1099-007593d0&quot;,&quot;ignoreErrorNames&quot;:[&quot;NetworkError&quot;,&quot;SecurityError&quot;],&quot;ignoreErrorsPreset&quot;:&quot;ReactApp&quot;,&quot;tags&quot;:{&quot;app_name&quot;:&quot;heifetz&quot;}}" src="./mybatis 3.x源码深度解析（五） - 知乎_files/init.js.下载"></script>
    <style data-emotion-css="uzm3ri">.css-uzm3ri{position:fixed;top:0;right:0;left:0;z-index:101;display:none;height:2px;pointer-events:none;background:#056DE8;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);}</style>
    <style data-emotion-css="1l12z7y">.css-1l12z7y{box-shadow:0px 16px 32px rgba(0,0,0,0.04);}</style>
    <style data-emotion-css="1hlrcxk">.css-1hlrcxk{-webkit-transition-property:fill;transition-property:fill;-webkit-transition-duration:0.25s;transition-duration:0.25s;-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;}</style>
    <style data-emotion-css="d5yzzu">.css-d5yzzu{box-sizing:border-box;margin:0;min-width:0;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-right:20px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}</style>
    <style data-emotion-css="1ay9vb9">.css-1ay9vb9{margin-right:16px;}</style>
    <style data-emotion-css="24crel">.css-24crel{display:inline-block;padding:0 16px;font-size:14px;line-height:32px;color:#ffffff;text-align:center;cursor:pointer;background:none;border:1px solid;border-radius:3px;background-color:#056DE8;border-color:#056DE8;margin-right:16px;}.css-24crel::mozFocusInner{padding:0;border:0;}.css-24crel:focus{outline:none;-webkit-transition:box-shadow 0.3s;transition:box-shadow 0.3s;}.css-24crel:focus-visible{box-shadow:0 0 0 2px #ffffff,0 0 0 4px rgba(5,109,232,0.3);}.css-24crel:disabled{cursor:default;opacity:0.5;}.css-24crel:hover{border-color:#0568dc;background-color:#0568dc;}</style>
    <style data-emotion-css="1fv1gmw">.css-1fv1gmw{position:fixed;bottom:50px;right:64px;width:336px;z-index:2;}</style>
    <style data-emotion-css="uodor8">.css-uodor8{border-radius:50%;}</style>
    <style data-emotion-css="1syywx2">.css-1syywx2{box-sizing:border-box;margin:0;min-width:0;max-width:100%;height:auto;background-color:#ffffff;width:38px;height:38px;border-radius:50%;}</style>
    <style data-emotion-css="1cd9gw4">.css-1cd9gw4{margin-left:.3em;}</style>
    <style data-emotion-css="1yuhvjn">.css-1yuhvjn{margin-top:16px;}</style>
    <style data-emotion-css="376mun">.css-376mun{position:relative;display:inline;}</style>
    <style data-emotion-css="1bbe1ut">
        .css-1bbe1ut .FileLinkCard{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:rgba(245,245,245,0.88);border-radius:12px;box-sizing:border-box;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:1em auto;max-width:100%;overflow:hidden;padding:12px;position:relative;width:390px;}.css-1bbe1ut .FileLinkCard-icon{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;height:30px;width:30px;}.css-1bbe1ut .FileLinkCard-info{margin-left:12px;}.css-1bbe1ut .FileLinkCard-name{color:#121212;font-size:15px;font-weight:500;line-height:21px;display:-webkit-box;text-overflow:ellipsis;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:2;}.css-1bbe1ut .FileLinkCard-meta{color:#999999;font-size:12px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;line-height:14px;margin-top:5px;}.css-1bbe1ut .FileLinkCard-source{white-space:pre;}.css-1bbe1ut img[data-uncomfortable]{content:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20344.88888888888886%20194%22%3E%3CforeignObject%20width%3D%22344.88888888888886%22%20height%3D%22194%22%3E%0A%20%20%20%20%20%20%3Cdiv%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%20style%3D%22font-size%3A%2013px%3B%20font-family%3A%20-apple-system%2C%20BlinkMacSystemFont%2C%20Microsoft%20YaHei%2C%20sans-serif%3B%20color%3A%20%23fff%3B%20width%3A100%25%3B%20height%3A194px%3B%22%3E%0A%20%20%20%20%20%20%20%20%3Cdiv%20style%3D%22display%3A%20flex%3B%20flex-direction%3A%20column%3B%20align-items%3A%20center%3B%20justify-content%3A%20center%3B%20height%3A%20100%25%3B%22%3E%0A%20%20%20%20%20%20%20%20%20%20%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2218%22%20height%3D%2218%22%20viewBox%3D%220%200%2016%2016%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M8%203.65a7%207%200%2000-1.353.128.65.65%200%2011-.25-1.275A8.3%208.3%200%20018%202.35c2.387%200%204.172.954%205.357%202.125C14.511%205.615%2015.15%207.022%2015.15%208c0%20.621-.257%201.391-.699%202.134a7.076%207.076%200%2001-1.403%201.68l.495.46a.65.65%200%2011-.886.951l-.998-.929a.645.645%200%2001-.104-.097L9.73%2010.501a.647.647%200%2001-.29.301%203.15%203.15%200%2001-4.313-4.094.647.647%200%2001.234-.275L3.908%205.08a5.774%205.774%200%2000-1.283%201.522C2.282%207.198%202.15%207.707%202.15%208c0%20.522.41%201.616%201.407%202.6.965.954%202.43%201.75%204.443%201.75.468%200%20.905-.043%201.311-.12a.65.65%200%2001.243%201.277A8.322%208.322%200%20018%2013.65c-2.387%200-4.172-.954-5.357-2.125C1.49%2010.385.85%208.978.85%208c0-.598.238-1.333.648-2.046A7.054%207.054%200%20012.95%204.188l-.547-.509a.65.65%200%2011.886-.951l8.8%208.194a5.793%205.793%200%20001.244-1.453c.372-.624.516-1.163.516-1.469%200-.522-.41-1.616-1.407-2.6-.965-.954-2.43-1.75-4.443-1.75zM6.29%207.296a1.85%201.85%200%20002.534%202.36l-2.535-2.36zM8%204.85a.65.65%200%20100%201.3%201.85%201.85%200%20011.843%201.694.65.65%200%20101.296-.11A3.15%203.15%200%20008%204.85z%22%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E%0A%20%20%20%20%20%20%20%20%20%20%3Cdiv%20style%3D%22margin%3A%20.6em%200%201.2em%22%3E%E8%AF%A5%E5%9B%BE%E7%89%87%E6%9C%89%E5%8F%AF%E8%83%BD%E4%BC%9A%E5%BC%95%E8%B5%B7%E4%B8%8D%E9%80%82%3C%2Fdiv%3E%0A%20%20%20%20%20%20%20%20%20%20%3Cbutton%20style%3D%22padding%3A%204px%201em%3B%20font-size%3A%201.1em%3B%20color%3A%20inherit%3B%20background%3A%20none%3B%20border%3A%201px%20solid%20rgba%28255%2C255%2C255%2C.5%29%3B%20border-radius%3A%209999px%3B%22%3E%E7%BB%A7%E7%BB%AD%E6%9F%A5%E7%9C%8B%3C%2Fbutton%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdiv%3E%0A%20%20%20%20%20%20%3C%2Fdiv%3E%0A%20%20%20%20%3C%2FforeignObject%3E%3C%2Fsvg%3E);width:100%;height:194px;background:url(https://pic1.zhimg.com/v2-cf70d0759d787c70091857151c1cad4a.jpeg) no-repeat rgba(191,191,191,0.7);background-size:cover;cursor:pointer!important;}.css-1bbe1ut img.content_image[data-size="normal"],.css-1bbe1ut img.origin_image[data-size="normal"]{width:100%;max-width:100%;}.css-1bbe1ut img.content_image[data-size="small"],.css-1bbe1ut img.origin_image[data-size="small"]{width:320px;max-width:100%;}

    </style>
    <style data-emotion-css="1n5wicu">
        .css-1n5wicu .LinkCard.new{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;box-sizing:border-box;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:390px;min-height:84px;border-radius:8px;max-width:100%;overflow:hidden;margin:16px auto;padding:12px 12px 9px 12px;background-color:#f5f5f5;}.css-1n5wicu .LinkCard.new,.css-1n5wicu .LinkCard.new:hover{-webkit-text-decoration:none;text-decoration:none;border:none !important;color:inherit !important;}.css-1n5wicu .LinkCard.new .LinkCard-contents{display:block;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;position:relative;}.css-1n5wicu .LinkCard.new .LinkCard-contents .loading{height:14px;background:#ebebeb;border-radius:7px;}.css-1n5wicu .LinkCard.new .LinkCard-contents.withTitle{margin-bottom:3px;}.css-1n5wicu .LinkCard.new .LinkCard-title{display:-webkit-box;font-size:15px;font-weight:500;line-height:1.4;margin-bottom:2px;color:#121212;text-overflow:ellipsis;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:1;}.css-1n5wicu .LinkCard.new .LinkCard-title.two-line{line-height:20px;display:-webkit-box;text-overflow:ellipsis;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:2;}.css-1n5wicu .LinkCard.new .LinkCard-title.loading{margin-bottom:8px;width:80%;}.css-1n5wicu .LinkCard.new .LinkCard-title.loading.withTitle{margin-bottom:6px;}.css-1n5wicu .LinkCard.new .LinkCard-title.loadingTitle{margin-bottom:5px;}.css-1n5wicu .LinkCard.new .LinkCard-excerpt{display:-webkit-box;text-overflow:ellipsis;font-size:13px;line-height:18px;color:#999999;margin-bottom:4px;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:1;}.css-1n5wicu .LinkCard.new .LinkCard-excerpt .LinkCard-author{color:#454545;}.css-1n5wicu .LinkCard.new .LinkCard-desc{display:-webkit-box;font-size:13px;height:18px;line-height:18px;color:#999999;word-break:break-all;text-overflow:ellipsis;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:1;}.css-1n5wicu .LinkCard.new .LinkCard-desc .LinkCard-tag,.css-1n5wicu .LinkCard.new .LinkCard-desc .tag{display:inline-block;font-size:11px;margin-left:8px;padding:0 4px;border-radius:3px;background:rgba(209,209,209,0.3);}.css-1n5wicu .LinkCard.new .LinkCard-desc.loading{width:40%;}.css-1n5wicu .LinkCard.new .LinkCard-desc svg{margin-right:2px;}.css-1n5wicu .LinkCard.new .LinkCard-image{-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;background-color:#ebebeb;background-size:cover;background-position:center;position:relative;display:block;width:60px;height:60px;margin-left:20px;object-fit:cover;border-radius:inherit;overflow:hidden;}.css-1n5wicu .LinkCard.new .LinkCard-image.LinkCard-image--default{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;background-color:#ebebeb;color:#d1d1d1;}.css-1n5wicu .LinkCard.new .LinkCard-image.LinkCard-image--default svg{color:#999999;}.css-1n5wicu .LinkCard.new .LinkCard-image img{width:100%;height:100%;object-fit:cover;}.css-1n5wicu .LinkCard.new .LinkCard-image .LinkCard-image--video{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;position:absolute;top:50%;left:50%;-webkit-transform:translateX(-50%) translateY(-50%);-ms-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%);width:24px;height:24px;border-radius:12px;background:rgba(255,255,255,0.9);pointer-events:none;}.css-1n5wicu .LinkCard.new .LinkCard-image .LinkCard-image--video svg{color:#454545;}.css-1n5wicu .LinkCard.new .LinkCard-richText .text{color:#454545;}.css-1n5wicu .LinkCard.new .LinkCard-richText .bold{font-weight:600;}.css-1n5wicu .LinkCard.new .LinkCard-richText .tag{margin-left:4px;}.css-1n5wicu .LinkCard.old{position:relative;display:block;margin:1em auto;width:390px;box-sizing:border-box;border-radius:12px;max-width:100%;overflow:hidden;}.css-1n5wicu .LinkCard.old,.css-1n5wicu .LinkCard.old:hover{-webkit-text-decoration:none;text-decoration:none;border:none !important;color:inherit !important;}.css-1n5wicu .LinkCard-ecommerceLoadingCard{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:12px;border-radius:inherit;height:80px;box-sizing:border-box;background:rgba(245,245,245,0.88);color:#d1d1d1;}.css-1n5wicu .LinkCard-ecommerceLoadingCardAvatarWrapper{width:60px;height:60px;background:#ebebeb;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;border-radius:6px;margin-right:10px;}.css-1n5wicu .LinkCard-ecommerceLoadingCardNetwork{width:20px;height:20px;}.css-1n5wicu .LinkCard-ecommerceLoadingCardLoadingbar{height:60px;-webkit-flex:1;-ms-flex:1;flex:1;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}.css-1n5wicu .LinkCard-ecommerceLoadingCardLoadingbar span{height:16px;display:inline-block;background:#ebebeb;}.css-1n5wicu .LinkCard-ecommerceLoadingCardLoadingbar span:nth-of-type(1){width:60px;margin-bottom:4px;}.css-1n5wicu .LinkCard-ecommerceLoadingCardLoadingbar span:nth-of-type(2){width:127px;}

    </style>
    <style data-emotion-css="1cfd2nk">
        .css-1cfd2nk .LinkCard.old{position:relative;display:block;margin:1em auto;width:390px;box-sizing:border-box;border-radius:12px;max-width:100%;overflow:hidden;}.css-1cfd2nk .LinkCard.old,.css-1cfd2nk .LinkCard.old:hover{-webkit-text-decoration:none;text-decoration:none;border:none !important;color:inherit !important;}.css-1cfd2nk .LinkCard-ecommerceLoadingCard{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:12px;border-radius:inherit;height:80px;box-sizing:border-box;background:rgba(245,245,245,0.88);color:#d1d1d1;}.css-1cfd2nk .LinkCard-ecommerceLoadingCardAvatarWrapper{width:60px;height:60px;background:#ebebeb;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;border-radius:6px;margin-right:10px;}.css-1cfd2nk .LinkCard-ecommerceLoadingCardNetwork{width:20px;height:20px;}.css-1cfd2nk .LinkCard-ecommerceLoadingCardLoadingbar{height:60px;-webkit-flex:1;-ms-flex:1;flex:1;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}.css-1cfd2nk .LinkCard-ecommerceLoadingCardLoadingbar span{height:16px;display:inline-block;background:#ebebeb;}.css-1cfd2nk .LinkCard-ecommerceLoadingCardLoadingbar span:nth-of-type(1){width:60px;margin-bottom:4px;}.css-1cfd2nk .LinkCard-ecommerceLoadingCardLoadingbar span:nth-of-type(2){width:127px;}.css-1cfd2nk .LinkCard.new{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;box-sizing:border-box;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:390px;min-height:84px;border-radius:8px;max-width:100%;overflow:hidden;margin:16px auto;padding:12px 12px 9px 12px;background-color:#f5f5f5;}.css-1cfd2nk .LinkCard.new,.css-1cfd2nk .LinkCard.new:hover{-webkit-text-decoration:none;text-decoration:none;border:none !important;color:inherit !important;}.css-1cfd2nk .LinkCard.new .LinkCard-contents{display:block;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;position:relative;}.css-1cfd2nk .LinkCard.new .LinkCard-contents .loading{height:14px;background:#ebebeb;border-radius:7px;}.css-1cfd2nk .LinkCard.new .LinkCard-contents.withTitle{margin-bottom:3px;}.css-1cfd2nk .LinkCard.new .LinkCard-title{display:-webkit-box;font-size:15px;font-weight:500;line-height:1.4;margin-bottom:2px;color:#121212;text-overflow:ellipsis;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:1;}.css-1cfd2nk .LinkCard.new .LinkCard-title.two-line{line-height:20px;display:-webkit-box;text-overflow:ellipsis;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:2;}.css-1cfd2nk .LinkCard.new .LinkCard-title.loading{margin-bottom:8px;width:80%;}.css-1cfd2nk .LinkCard.new .LinkCard-title.loading.withTitle{margin-bottom:6px;}.css-1cfd2nk .LinkCard.new .LinkCard-title.loadingTitle{margin-bottom:5px;}.css-1cfd2nk .LinkCard.new .LinkCard-excerpt{display:-webkit-box;text-overflow:ellipsis;font-size:13px;line-height:18px;color:#999999;margin-bottom:4px;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:1;}.css-1cfd2nk .LinkCard.new .LinkCard-excerpt .LinkCard-author{color:#454545;}.css-1cfd2nk .LinkCard.new .LinkCard-desc{display:-webkit-box;font-size:13px;height:18px;line-height:18px;color:#999999;word-break:break-all;text-overflow:ellipsis;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:1;}.css-1cfd2nk .LinkCard.new .LinkCard-desc .LinkCard-tag,.css-1cfd2nk .LinkCard.new .LinkCard-desc .tag{display:inline-block;font-size:11px;margin-left:8px;padding:0 4px;border-radius:3px;background:rgba(209,209,209,0.3);}.css-1cfd2nk .LinkCard.new .LinkCard-desc.loading{width:40%;}.css-1cfd2nk .LinkCard.new .LinkCard-desc svg{margin-right:2px;}.css-1cfd2nk .LinkCard.new .LinkCard-image{-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;background-color:#ebebeb;background-size:cover;background-position:center;position:relative;display:block;width:60px;height:60px;margin-left:20px;object-fit:cover;border-radius:inherit;overflow:hidden;}.css-1cfd2nk .LinkCard.new .LinkCard-image.LinkCard-image--default{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;background-color:#ebebeb;color:#d1d1d1;}.css-1cfd2nk .LinkCard.new .LinkCard-image.LinkCard-image--default svg{color:#999999;}.css-1cfd2nk .LinkCard.new .LinkCard-image img{width:100%;height:100%;object-fit:cover;}.css-1cfd2nk .LinkCard.new .LinkCard-image .LinkCard-image--video{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;position:absolute;top:50%;left:50%;-webkit-transform:translateX(-50%) translateY(-50%);-ms-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%);width:24px;height:24px;border-radius:12px;background:rgba(255,255,255,0.9);pointer-events:none;}.css-1cfd2nk .LinkCard.new .LinkCard-image .LinkCard-image--video svg{color:#454545;}.css-1cfd2nk .LinkCard.new .LinkCard-richText .text{color:#454545;}.css-1cfd2nk .LinkCard.new .LinkCard-richText .bold{font-weight:600;}.css-1cfd2nk .LinkCard.new .LinkCard-richText .tag{margin-left:4px;}.css-1cfd2nk .FileLinkCard{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:rgba(245,245,245,0.88);border-radius:12px;box-sizing:border-box;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:1em auto;max-width:100%;overflow:hidden;padding:12px;position:relative;width:390px;}.css-1cfd2nk .FileLinkCard-icon{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;height:30px;width:30px;}.css-1cfd2nk .FileLinkCard-info{margin-left:12px;}.css-1cfd2nk .FileLinkCard-name{color:#121212;font-size:15px;font-weight:500;line-height:21px;display:-webkit-box;text-overflow:ellipsis;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:2;}.css-1cfd2nk .FileLinkCard-meta{color:#999999;font-size:12px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;line-height:14px;margin-top:5px;}.css-1cfd2nk .FileLinkCard-source{white-space:pre;}.css-1cfd2nk img[data-uncomfortable]{content:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20344.88888888888886%20194%22%3E%3CforeignObject%20width%3D%22344.88888888888886%22%20height%3D%22194%22%3E%0A%20%20%20%20%20%20%3Cdiv%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%20style%3D%22font-size%3A%2013px%3B%20font-family%3A%20-apple-system%2C%20BlinkMacSystemFont%2C%20Microsoft%20YaHei%2C%20sans-serif%3B%20color%3A%20%23fff%3B%20width%3A100%25%3B%20height%3A194px%3B%22%3E%0A%20%20%20%20%20%20%20%20%3Cdiv%20style%3D%22display%3A%20flex%3B%20flex-direction%3A%20column%3B%20align-items%3A%20center%3B%20justify-content%3A%20center%3B%20height%3A%20100%25%3B%22%3E%0A%20%20%20%20%20%20%20%20%20%20%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2218%22%20height%3D%2218%22%20viewBox%3D%220%200%2016%2016%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M8%203.65a7%207%200%2000-1.353.128.65.65%200%2011-.25-1.275A8.3%208.3%200%20018%202.35c2.387%200%204.172.954%205.357%202.125C14.511%205.615%2015.15%207.022%2015.15%208c0%20.621-.257%201.391-.699%202.134a7.076%207.076%200%2001-1.403%201.68l.495.46a.65.65%200%2011-.886.951l-.998-.929a.645.645%200%2001-.104-.097L9.73%2010.501a.647.647%200%2001-.29.301%203.15%203.15%200%2001-4.313-4.094.647.647%200%2001.234-.275L3.908%205.08a5.774%205.774%200%2000-1.283%201.522C2.282%207.198%202.15%207.707%202.15%208c0%20.522.41%201.616%201.407%202.6.965.954%202.43%201.75%204.443%201.75.468%200%20.905-.043%201.311-.12a.65.65%200%2001.243%201.277A8.322%208.322%200%20018%2013.65c-2.387%200-4.172-.954-5.357-2.125C1.49%2010.385.85%208.978.85%208c0-.598.238-1.333.648-2.046A7.054%207.054%200%20012.95%204.188l-.547-.509a.65.65%200%2011.886-.951l8.8%208.194a5.793%205.793%200%20001.244-1.453c.372-.624.516-1.163.516-1.469%200-.522-.41-1.616-1.407-2.6-.965-.954-2.43-1.75-4.443-1.75zM6.29%207.296a1.85%201.85%200%20002.534%202.36l-2.535-2.36zM8%204.85a.65.65%200%20100%201.3%201.85%201.85%200%20011.843%201.694.65.65%200%20101.296-.11A3.15%203.15%200%20008%204.85z%22%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E%0A%20%20%20%20%20%20%20%20%20%20%3Cdiv%20style%3D%22margin%3A%20.6em%200%201.2em%22%3E%E8%AF%A5%E5%9B%BE%E7%89%87%E6%9C%89%E5%8F%AF%E8%83%BD%E4%BC%9A%E5%BC%95%E8%B5%B7%E4%B8%8D%E9%80%82%3C%2Fdiv%3E%0A%20%20%20%20%20%20%20%20%20%20%3Cbutton%20style%3D%22padding%3A%204px%201em%3B%20font-size%3A%201.1em%3B%20color%3A%20inherit%3B%20background%3A%20none%3B%20border%3A%201px%20solid%20rgba%28255%2C255%2C255%2C.5%29%3B%20border-radius%3A%209999px%3B%22%3E%E7%BB%A7%E7%BB%AD%E6%9F%A5%E7%9C%8B%3C%2Fbutton%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdiv%3E%0A%20%20%20%20%20%20%3C%2Fdiv%3E%0A%20%20%20%20%3C%2FforeignObject%3E%3C%2Fsvg%3E);width:100%;height:194px;background:url(https://pic1.zhimg.com/v2-cf70d0759d787c70091857151c1cad4a.jpeg) no-repeat rgba(191,191,191,0.7);background-size:cover;cursor:pointer!important;}.css-1cfd2nk img.content_image[data-size="normal"],.css-1cfd2nk img.origin_image[data-size="normal"]{width:100%;max-width:100%;}.css-1cfd2nk img.content_image[data-size="small"],.css-1cfd2nk img.origin_image[data-size="small"]{width:320px;max-width:100%;}

    </style>
    <style data-emotion-css="117anjg animation-1yvu044">
        .css-117anjg{word-break:break-word;line-height:1.6;}.css-117anjg > [data-first-child]{margin-top:0;}.css-117anjg > :last-child{margin-bottom:0;}.css-117anjg h1,.css-117anjg h2{clear:left;margin-top:calc((1.4em * 2) / 1.2);margin-bottom:calc(1.4em / 1.2);font-size:1.2em;line-height:1.5;font-weight:600;}.css-117anjg h3,.css-117anjg h4,.css-117anjg h5,.css-117anjg h6{clear:left;margin-top:calc((1.4em * 1.5) / 1.1);margin-bottom:calc(1.4em / 1.1);font-size:1.1em;line-height:1.5;font-weight:600;}.css-117anjg u{-webkit-text-decoration:none;text-decoration:none;border-bottom:1px solid #454545;}.css-117anjg b{font-weight:600;}.css-117anjg sup{font-size:0.8em;}.css-117anjg sup[data-draft-type='reference']{color:#175399;}.css-117anjg a:focus{outline:none;-webkit-transition:box-shadow 0.3s;transition:box-shadow 0.3s;}html[data-focus-visible] .css-117anjg a:focus{box-shadow:0 0 0 2px #ffffff,0 0 0 4px rgba(5,109,232,0.3);}.css-117anjg a.ztext-link,.css-117anjg a.internal,.css-117anjg a.external{-webkit-text-decoration:none;text-decoration:none;cursor:pointer;border-bottom:1px solid #808080;}.css-117anjg a.ztext-link:hover,.css-117anjg a.internal:hover,.css-117anjg a.external:hover{color:#175399;border-bottom:1px solid #175399;}.css-117anjg a.ztext-link > .ellipsis::after,.css-117anjg a.internal > .ellipsis::after,.css-117anjg a.external > .ellipsis::after{content:'...';}.css-117anjg a.ztext-link > .invisible,.css-117anjg a.internal > .invisible,.css-117anjg a.external > .invisible{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;}.css-117anjg a.ztext-link u,.css-117anjg a.internal u,.css-117anjg a.external u{border:none;}.css-117anjg a.member_mention{color:#175399;}.css-117anjg a.member_mention:hover{border-bottom:1px solid #175399;}.css-117anjg a.UserLink-link{color:#175399;}.css-117anjg a.UserLink-link:hover{border-bottom:1px solid #175399;}.css-117anjg p{margin:1.4em 0;}.css-117anjg p.ztext-empty-paragraph{margin:calc((2.8em- (1.4em * 2 + 1.6em)) / 2) 0;}.css-117anjg p.ztext-empty-paragraph + .ztext-empty-paragraph{margin:1.4em 0;}.css-117anjg hr{margin:4em auto;width:240px;max-width:100%;border:none;border-top:1px solid #d1d1d1;}.css-117anjg img[eeimg]{max-width:100%;vertical-align:middle;}.css-117anjg img[eeimg="1"]{margin:0 3px;max-width:calc(100% - 6px);display:inline-block;}.css-117anjg img[eeimg="2"]{margin:1.4em auto;display:block;}.css-117anjg blockquote{margin:1.4em 0;padding-left:1em;color:#636363;border-left:3px solid #d1d1d1;}.css-117anjg ol,.css-117anjg ul{margin:1.4em 0;padding:0;width:100%;}.css-117anjg ol ol,.css-117anjg ul ol,.css-117anjg ol ul,.css-117anjg ul ul{margin:0;}.css-117anjg ol li::before,.css-117anjg ul li::before{width:1em;}.css-117anjg ol > ol,.css-117anjg ul > ol,.css-117anjg ol > ul,.css-117anjg ul > ul{display:table-row;}.css-117anjg ol > ol::before,.css-117anjg ul > ol::before,.css-117anjg ol > ul::before,.css-117anjg ul > ul::before{display:table-cell;content:'';}.css-117anjg ul{display:table;}.css-117anjg ul>li{display:table-row;list-style:none;}.css-117anjg ul>li::before{display:table-cell;content:'•  ';white-space:pre;}.css-117anjg ol{display:table;counter-reset:ol;}.css-117anjg ol > li{display:table-row;list-style:none;}.css-117anjg ol > li::before{display:table-cell;text-align:right;counter-increment:ol;content:counter(ol) '. ';white-space:pre;}.css-117anjg ol ol{counter-reset:ol2;}.css-117anjg ol ol li::before{counter-increment:ol2;content:counter(ol2) '. ';}.css-117anjg ol ol ol{counter-reset:ol3;}.css-117anjg ol ol ol li::before{counter-increment:ol3;content:counter(ol3) '. ';}.css-117anjg ol ol ol ol{counter-reset:ol4;}.css-117anjg ol ol ol ol li::before{counter-increment:ol4;content:counter(ol4) '. ';}.css-117anjg figure{margin:1.4em 0;}.css-117anjg figure .content_image,.css-117anjg figure .origin_image{margin:0 auto;}.css-117anjg figure figcaption{margin-top:calc(0.6em / 0.9);padding:0 1em;font-size:0.9em;line-height:1.5;text-align:center;color:#999999;}.css-117anjg figure + figure{margin-top:calc(1.4em * 1.6);}.css-117anjg figure[data-size='small'],.css-117anjg figure:not([data-size]) > [data-size='small']{clear:both;}.css-117anjg figure[data-size='left'],.css-117anjg figure:not([data-size]) > [data-size='left']{float:left;margin:0 20px 20px 0;max-width:33%;}.css-117anjg figure[data-size='right'],.css-117anjg figure:not([data-size]) > [data-size='right']{float:right;margin:0 0 20px 20px;max-width:33%;}.css-117anjg figure[data-size='collapse']{margin-bottom:0;}.css-117anjg figure[data-size='collapse'] + figure{margin-top:0;}.css-117anjg .content_image,.css-117anjg .origin_image{display:block;max-width:100%;height:auto;margin:1.4em auto;}.css-117anjg .content_image[data-size='small'],.css-117anjg .origin_image[data-size='small']{max-width:40%;}.css-117anjg .content_image.zh-lightbox-thumb,.css-117anjg .origin_image.zh-lightbox-thumb{cursor:-webkit-zoom-in;cursor:-moz-zoom-in;cursor:zoom-in;}.css-117anjg code{margin:0 2px;padding:3px 4px;border-radius:3px;font-family:Menlo,Monaco,Consolas,'Andale Mono','lucida console','Courier New',monospace;font-size:0.9em;background-color:#f5f5f5;}.css-117anjg pre{margin:1.4em 0;padding:calc(0.8em / 0.9);font-size:0.9em;word-break:initial;word-wrap:initial;white-space:pre;overflow:auto;-webkit-overflow-scrolling:touch;background:#f5f5f5;border-radius:4px;}.css-117anjg pre code{margin:0;padding:0;font-size:inherit;border-radius:0;background-color:inherit;}.css-117anjg li pre{white-space:pre-wrap;}.css-117anjg table[data-draft-type='table']{border-collapse:collapse;font-size:15px;margin:1.4em auto;max-width:100%;table-layout:fixed;text-align:left;width:100%;}.css-117anjg table[data-draft-type='table'][data-size='small']{min-width:260px;width:40%;}.css-117anjg table[data-draft-type='table'][data-row-style='striped'] tr:nth-of-type(2n + 1){background:#f5f5f5;}.css-117anjg table[data-draft-type='table'] td,.css-117anjg table[data-draft-type='table'] th{border:1px solid #d1d1d1;line-height:24px;height:24px;padding:3px 12px;}.css-117anjg table[data-draft-type='table'] th{background:#ebebeb;color:#121212;font-weight:500;}.css-117anjg .video-box,.css-117anjg .link-box{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:1.4em 0;overflow:auto;white-space:normal;cursor:pointer;border:solid 1px #ebebeb;border-radius:4px;}.css-117anjg .lazy[data-lazy-status]{background-color:#f5f5f5;}.css-117anjg .lazy[data-lazy-status="ok"]{background-color:transparent;-webkit-animation:animation-1yvu044 0.5s ease-in;animation:animation-1yvu044 0.5s ease-in;}.css-117anjg .highlight{margin:1em 0;}.css-117anjg .highlight pre{margin:0;}.css-117anjg .highlight .hll{background-color:#f5f5f5;}.css-117anjg .highlight .c{font-style:italic;color:#999999;}.css-117anjg .highlight .err{color:#F1403C;}.css-117anjg .highlight .k{font-weight:600;}.css-117anjg .highlight .o{font-weight:600;}.css-117anjg .highlight .cm{font-style:italic;color:#999999;}.css-117anjg .highlight .cp{font-weight:600;color:#999999;}.css-117anjg .highlight .c1{font-style:italic;color:#999999;}.css-117anjg .highlight .cs{font-style:italic;font-weight:600;color:#999999;}.css-117anjg .highlight .gd{color:#FF3366;}.css-117anjg .highlight .ge{font-style:italic;}.css-117anjg .highlight .gr{color:#F1403C;}.css-117anjg .highlight .gh{color:#999999;}.css-117anjg .highlight .gi{color:#12b370;}.css-117anjg .highlight .go{color:#808080;}.css-117anjg .highlight .gp{color:#636363;}.css-117anjg .highlight .gs{font-weight:600;}.css-117anjg .highlight .gu{color:#999999;}.css-117anjg .highlight .gt{color:#F1403C;}.css-117anjg .highlight .kc{font-weight:600;}.css-117anjg .highlight .kd{font-weight:600;}.css-117anjg .highlight .kn{font-weight:600;}.css-117anjg .highlight .kp{font-weight:600;}.css-117anjg .highlight .kr{font-weight:600;}.css-117anjg .highlight .kt{font-weight:600;color:#175399;}.css-117anjg .highlight .m{color:#056DE8;}.css-117anjg .highlight .s{color:#F1403C;}.css-117anjg .highlight .na{color:#056DE8;}.css-117anjg .highlight .nb{color:#056DE8;}.css-117anjg .highlight .nc{font-weight:600;color:#175399;}.css-117anjg .highlight .no{color:#056DE8;}.css-117anjg .highlight .ni{color:#5555DD;}.css-117anjg .highlight .ne{font-weight:600;color:#F1403C;}.css-117anjg .highlight .nf{font-weight:600;color:#F1403C;}.css-117anjg .highlight .nn{color:#636363;}.css-117anjg .highlight .nt{color:#175399;}.css-117anjg .highlight .nv{color:#056DE8;}.css-117anjg .highlight .ow{font-weight:600;}.css-117anjg .highlight .w{color:#bfbfbf;}.css-117anjg .highlight .mf{color:#056DE8;}.css-117anjg .highlight .mh{color:#056DE8;}.css-117anjg .highlight .mi{color:#056DE8;}.css-117anjg .highlight .mo{color:#056DE8;}.css-117anjg .highlight .sb{color:#F1403C;}.css-117anjg .highlight .sc{color:#F1403C;}.css-117anjg .highlight .sd{color:#F1403C;}.css-117anjg .highlight .s2{color:#F1403C;}.css-117anjg .highlight .se{color:#F1403C;}.css-117anjg .highlight .sh{color:#F1403C;}.css-117anjg .highlight .si{color:#F1403C;}.css-117anjg .highlight .sx{color:#F1403C;}.css-117anjg .highlight .sr{color:#A5542F;}.css-117anjg .highlight .s1{color:#F1403C;}.css-117anjg .highlight .ss{color:#F1403C;}.css-117anjg .highlight .bp{color:#999999;}.css-117anjg .highlight .vc{color:#056DE8;}.css-117anjg .highlight .vg{color:#056DE8;}.css-117anjg .highlight .vi{color:#056DE8;}.css-117anjg .highlight .il{color:#056DE8;}.css-117anjg .highlight::-webkit-scrollbar{width:6px;height:6px;}.css-117anjg .highlight::-webkit-scrollbar-thumb:horizontal{background-color:rgba(18,18,18,0.5);border-radius:6px;}.css-117anjg .highlight::-webkit-scrollbar-thumb:horizontal:hover{background-color:rgba(18,18,18,0.6);}.css-117anjg .LinkCard.old{position:relative;display:block;margin:1em auto;width:390px;box-sizing:border-box;border-radius:12px;max-width:100%;overflow:hidden;}.css-117anjg .LinkCard.old,.css-117anjg .LinkCard.old:hover{-webkit-text-decoration:none;text-decoration:none;border:none !important;color:inherit !important;}.css-117anjg .LinkCard-ecommerceLoadingCard{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:12px;border-radius:inherit;height:80px;box-sizing:border-box;background:rgba(245,245,245,0.88);color:#d1d1d1;}.css-117anjg .LinkCard-ecommerceLoadingCardAvatarWrapper{width:60px;height:60px;background:#ebebeb;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;border-radius:6px;margin-right:10px;}.css-117anjg .LinkCard-ecommerceLoadingCardNetwork{width:20px;height:20px;}.css-117anjg .LinkCard-ecommerceLoadingCardLoadingbar{height:60px;-webkit-flex:1;-ms-flex:1;flex:1;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}.css-117anjg .LinkCard-ecommerceLoadingCardLoadingbar span{height:16px;display:inline-block;background:#ebebeb;}.css-117anjg .LinkCard-ecommerceLoadingCardLoadingbar span:nth-of-type(1){width:60px;margin-bottom:4px;}.css-117anjg .LinkCard-ecommerceLoadingCardLoadingbar span:nth-of-type(2){width:127px;}.css-117anjg .LinkCard.new{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;box-sizing:border-box;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:390px;min-height:84px;border-radius:8px;max-width:100%;overflow:hidden;margin:16px auto;padding:12px 12px 9px 12px;background-color:#f5f5f5;}.css-117anjg .LinkCard.new,.css-117anjg .LinkCard.new:hover{-webkit-text-decoration:none;text-decoration:none;border:none !important;color:inherit !important;}.css-117anjg .LinkCard.new .LinkCard-contents{display:block;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;position:relative;}.css-117anjg .LinkCard.new .LinkCard-contents .loading{height:14px;background:#ebebeb;border-radius:7px;}.css-117anjg .LinkCard.new .LinkCard-contents.withTitle{margin-bottom:3px;}.css-117anjg .LinkCard.new .LinkCard-title{display:-webkit-box;font-size:15px;font-weight:500;line-height:1.4;margin-bottom:2px;color:#121212;text-overflow:ellipsis;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:1;}.css-117anjg .LinkCard.new .LinkCard-title.two-line{line-height:20px;display:-webkit-box;text-overflow:ellipsis;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:2;}.css-117anjg .LinkCard.new .LinkCard-title.loading{margin-bottom:8px;width:80%;}.css-117anjg .LinkCard.new .LinkCard-title.loading.withTitle{margin-bottom:6px;}.css-117anjg .LinkCard.new .LinkCard-title.loadingTitle{margin-bottom:5px;}.css-117anjg .LinkCard.new .LinkCard-excerpt{display:-webkit-box;text-overflow:ellipsis;font-size:13px;line-height:18px;color:#999999;margin-bottom:4px;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:1;}.css-117anjg .LinkCard.new .LinkCard-excerpt .LinkCard-author{color:#454545;}.css-117anjg .LinkCard.new .LinkCard-desc{display:-webkit-box;font-size:13px;height:18px;line-height:18px;color:#999999;word-break:break-all;text-overflow:ellipsis;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:1;}.css-117anjg .LinkCard.new .LinkCard-desc .LinkCard-tag,.css-117anjg .LinkCard.new .LinkCard-desc .tag{display:inline-block;font-size:11px;margin-left:8px;padding:0 4px;border-radius:3px;background:rgba(209,209,209,0.3);}.css-117anjg .LinkCard.new .LinkCard-desc.loading{width:40%;}.css-117anjg .LinkCard.new .LinkCard-desc svg{margin-right:2px;}.css-117anjg .LinkCard.new .LinkCard-image{-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;background-color:#ebebeb;background-size:cover;background-position:center;position:relative;display:block;width:60px;height:60px;margin-left:20px;object-fit:cover;border-radius:inherit;overflow:hidden;}.css-117anjg .LinkCard.new .LinkCard-image.LinkCard-image--default{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;background-color:#ebebeb;color:#d1d1d1;}.css-117anjg .LinkCard.new .LinkCard-image.LinkCard-image--default svg{color:#999999;}.css-117anjg .LinkCard.new .LinkCard-image img{width:100%;height:100%;object-fit:cover;}.css-117anjg .LinkCard.new .LinkCard-image .LinkCard-image--video{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;position:absolute;top:50%;left:50%;-webkit-transform:translateX(-50%) translateY(-50%);-ms-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%);width:24px;height:24px;border-radius:12px;background:rgba(255,255,255,0.9);pointer-events:none;}.css-117anjg .LinkCard.new .LinkCard-image .LinkCard-image--video svg{color:#454545;}.css-117anjg .LinkCard.new .LinkCard-richText .text{color:#454545;}.css-117anjg .LinkCard.new .LinkCard-richText .bold{font-weight:600;}.css-117anjg .LinkCard.new .LinkCard-richText .tag{margin-left:4px;}.css-117anjg .FileLinkCard{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:rgba(245,245,245,0.88);border-radius:12px;box-sizing:border-box;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:1em auto;max-width:100%;overflow:hidden;padding:12px;position:relative;width:390px;}.css-117anjg .FileLinkCard-icon{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;height:30px;width:30px;}.css-117anjg .FileLinkCard-info{margin-left:12px;}.css-117anjg .FileLinkCard-name{color:#121212;font-size:15px;font-weight:500;line-height:21px;display:-webkit-box;text-overflow:ellipsis;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:2;}.css-117anjg .FileLinkCard-meta{color:#999999;font-size:12px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;line-height:14px;margin-top:5px;}.css-117anjg .FileLinkCard-source{white-space:pre;}.css-117anjg img[data-uncomfortable]{content:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20344.88888888888886%20194%22%3E%3CforeignObject%20width%3D%22344.88888888888886%22%20height%3D%22194%22%3E%0A%20%20%20%20%20%20%3Cdiv%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%20style%3D%22font-size%3A%2013px%3B%20font-family%3A%20-apple-system%2C%20BlinkMacSystemFont%2C%20Microsoft%20YaHei%2C%20sans-serif%3B%20color%3A%20%23fff%3B%20width%3A100%25%3B%20height%3A194px%3B%22%3E%0A%20%20%20%20%20%20%20%20%3Cdiv%20style%3D%22display%3A%20flex%3B%20flex-direction%3A%20column%3B%20align-items%3A%20center%3B%20justify-content%3A%20center%3B%20height%3A%20100%25%3B%22%3E%0A%20%20%20%20%20%20%20%20%20%20%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2218%22%20height%3D%2218%22%20viewBox%3D%220%200%2016%2016%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M8%203.65a7%207%200%2000-1.353.128.65.65%200%2011-.25-1.275A8.3%208.3%200%20018%202.35c2.387%200%204.172.954%205.357%202.125C14.511%205.615%2015.15%207.022%2015.15%208c0%20.621-.257%201.391-.699%202.134a7.076%207.076%200%2001-1.403%201.68l.495.46a.65.65%200%2011-.886.951l-.998-.929a.645.645%200%2001-.104-.097L9.73%2010.501a.647.647%200%2001-.29.301%203.15%203.15%200%2001-4.313-4.094.647.647%200%2001.234-.275L3.908%205.08a5.774%205.774%200%2000-1.283%201.522C2.282%207.198%202.15%207.707%202.15%208c0%20.522.41%201.616%201.407%202.6.965.954%202.43%201.75%204.443%201.75.468%200%20.905-.043%201.311-.12a.65.65%200%2001.243%201.277A8.322%208.322%200%20018%2013.65c-2.387%200-4.172-.954-5.357-2.125C1.49%2010.385.85%208.978.85%208c0-.598.238-1.333.648-2.046A7.054%207.054%200%20012.95%204.188l-.547-.509a.65.65%200%2011.886-.951l8.8%208.194a5.793%205.793%200%20001.244-1.453c.372-.624.516-1.163.516-1.469%200-.522-.41-1.616-1.407-2.6-.965-.954-2.43-1.75-4.443-1.75zM6.29%207.296a1.85%201.85%200%20002.534%202.36l-2.535-2.36zM8%204.85a.65.65%200%20100%201.3%201.85%201.85%200%20011.843%201.694.65.65%200%20101.296-.11A3.15%203.15%200%20008%204.85z%22%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E%0A%20%20%20%20%20%20%20%20%20%20%3Cdiv%20style%3D%22margin%3A%20.6em%200%201.2em%22%3E%E8%AF%A5%E5%9B%BE%E7%89%87%E6%9C%89%E5%8F%AF%E8%83%BD%E4%BC%9A%E5%BC%95%E8%B5%B7%E4%B8%8D%E9%80%82%3C%2Fdiv%3E%0A%20%20%20%20%20%20%20%20%20%20%3Cbutton%20style%3D%22padding%3A%204px%201em%3B%20font-size%3A%201.1em%3B%20color%3A%20inherit%3B%20background%3A%20none%3B%20border%3A%201px%20solid%20rgba%28255%2C255%2C255%2C.5%29%3B%20border-radius%3A%209999px%3B%22%3E%E7%BB%A7%E7%BB%AD%E6%9F%A5%E7%9C%8B%3C%2Fbutton%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdiv%3E%0A%20%20%20%20%20%20%3C%2Fdiv%3E%0A%20%20%20%20%3C%2FforeignObject%3E%3C%2Fsvg%3E);width:100%;height:194px;background:url(https://pic1.zhimg.com/v2-cf70d0759d787c70091857151c1cad4a.jpeg) no-repeat rgba(191,191,191,0.7);background-size:cover;cursor:pointer!important;}.css-117anjg img.content_image[data-size="normal"],.css-117anjg img.origin_image[data-size="normal"]{width:100%;max-width:100%;}.css-117anjg img.content_image[data-size="small"],.css-117anjg img.origin_image[data-size="small"]{width:320px;max-width:100%;}@-webkit-keyframes animation-1yvu044{from{opacity:0;}to{opacity:1;}}@keyframes animation-1yvu044{from{opacity:0;}to{opacity:1;}}

    </style>
    <style data-emotion-css="1s3a4zw">.css-1s3a4zw{position:relative;display:inline-block;height:30px;padding:0 12px;font-size:14px;line-height:30px;color:#056DE8;vertical-align:top;border-radius:100px;background:rgba(5,109,232,0.1);}.css-1s3a4zw:hover{background-color:rgba(5,109,232,0.15);}</style>
    <style data-emotion-css="1xlfegr">.css-1xlfegr{background:transparent;box-shadow:none;}</style>
    <style data-emotion-css="1gomreu">.css-1gomreu{position:relative;display:inline-block;}</style>
    <style data-emotion-css="1u7r5c9">.css-1u7r5c9{box-sizing:border-box;margin:0;min-width:0;max-width:100%;height:auto;background-color:#ffffff;width:40px;height:40px;border-radius:50%;}</style>
    <style data-emotion="css"></style>
    <script async="" charset="UTF-8" src="./mybatis 3.x源码深度解析（五） - 知乎_files/tool.min.js.下载" type="text/javascript"></script>
    <script async="" charset="UTF-8" src="./mybatis 3.x源码深度解析（五） - 知乎_files/core.v2.23.0.min.js.下载" type="text/javascript"></script>
    <script async="" charset="UTF-8" src="./mybatis 3.x源码深度解析（五） - 知乎_files/light.v2.23.0.min.js.下载" type="text/javascript"></script>
    <style type="text/css">
        .yidun.yidun--light.yidun--error.yidun--icon_point .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--error.yidun--inference .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--error.yidun--maxerror .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--error.yidun--point .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--error.yidun--sms .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--error.yidun--space .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--error.yidun--voice .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--error.yidun--word_order .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--icon_point.yidun--button .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--inference.yidun--button .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--point.yidun--button .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--space.yidun--button .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--success.yidun--icon_point .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--success.yidun--inference .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--success.yidun--point .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--success.yidun--sms .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--success.yidun--space .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--success.yidun--voice .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--success.yidun--word_order .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--word_order.yidun--button .yidun_tips .yidun_tips__icon,.yidun.yidun--light .yidun_loadbox .yidun_loadbox__inner,.yidun.yidun--light .yidun_loadbox .yidun_loadbox__inner .yidun_loadicon,.yidun.yidun--light .yidun_tips__answer,.yidun.yidun--light .yidun_tips__before,.yidun.yidun--light .yidun_tips__content,.yidun_intellisense--light .yidun_classic-tips .yidun_tips__icon,.yidun_intellisense--light .yidun_intelli-icon,.yidun_popup.yidun_popup--light .yidun_modal,.yidun_popup.yidun_popup--light .yidun_modal__before,.yidun_popup.yidun_popup--light .yidun_modal__sibling,.yidun_popup.yidun_popup--light .yidun_modal__title{display:inline-block;*display:inline;zoom:1;vertical-align:top}.yidun,.yidun_popup{-webkit-text-size-adjust:100%!important;-ms-text-size-adjust:100%!important;text-size-adjust:100%!important;-moz-text-size-adjust:100%!important}.yidun{-webkit-tap-highlight-color:transparent}.yidun *{box-sizing:border-box}.yidun :focus-visible{outline:2px solid #4997fd}.panel_ease_top-enter,.panel_ease_top-leave-active{opacity:0;transform:translateY(20px)}.panel_ease_bottom-enter,.panel_ease_bottom-leave-active{opacity:0;transform:translateY(-20px)}.panel_ease_bottom-enter-active,.panel_ease_bottom-leave-active,.panel_ease_top-enter-active,.panel_ease_top-leave-active{transition:all .2s linear;pointer-events:none}.popup_scale-enter,.popup_scale-leave-active{opacity:0;transform:scale(0)}.popup_scale-enter-active{transition:all .3s cubic-bezier(.76,.01,.35,1.56)}.popup_scale-leave-active{transition:all .2s ease-out}.popup_ease-enter{opacity:0;transform:translateY(-20px)}.popup_ease-enter-active{transition:opacity .3s linear,transform .3s linear}.popup_ease-leave-active{opacity:0;transform:translateY(-20px);transition:all .2s ease-out}@keyframes loading{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes ball-scale-multiple{0%{transform:scale(.22);opacity:0}5%{opacity:1}to{transform:scale(1);opacity:0}}@keyframes bright{0%{opacity:.5}to{opacity:1}}.yidun_cover-frame{position:absolute;top:0;left:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0)}.yidun.yidun--light{position:relative;margin:auto;font-size:14px;-ms-touch-action:none;touch-action:none}.yidun.yidun--light img{pointer-events:none}.yidun.yidun--light .yidun_jigsaw,.yidun.yidun--light .yidun_slide_indicator,.yidun.yidun--light .yidun_slider{display:none}.yidun.yidun--light.yidun--jigsaw .yidun_jigsaw,.yidun.yidun--light.yidun--jigsaw .yidun_slide_indicator,.yidun.yidun--light.yidun--jigsaw .yidun_slider{display:block}.yidun.yidun--light.yidun--jigsaw .yidun_tips__content{width:100%}.yidun.yidun--light.yidun--jigsaw .yidun_tips{padding-left:40px}.yidun.yidun--light .yidun_jigsaw{position:absolute;left:0;top:0;width:auto;height:100%;-webkit-transform:translateZ(0);-webkit-perspective:1000;-webkit-backface-visibility:hidden;pointer-events:auto}.yidun.yidun--light .yidun_icon-point{position:absolute;width:26px;height:33px;cursor:pointer;background-repeat:no-repeat}.yidun.yidun--light .yidun_icon-point.yidun_point-1{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -997px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light .yidun_icon-point.yidun_point-1{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -994px;background-size:40px 1515px}}.yidun.yidun--light .yidun_icon-point.yidun_point-2{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1111px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light .yidun_icon-point.yidun_point-2{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1108px;background-size:40px 1515px}}.yidun.yidun--light .yidun_icon-point.yidun_point-3{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1035px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light .yidun_icon-point.yidun_point-3{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1032px;background-size:40px 1515px}}.yidun.yidun--light .yidun_icon-point.yidun_point-4{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1073px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light .yidun_icon-point.yidun_point-4{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1070px;background-size:40px 1515px}}.yidun.yidun--light .yidun_icon-point.yidun_point-5{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1149px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light .yidun_icon-point.yidun_point-5{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1146px;background-size:40px 1515px}}.yidun.yidun--light.yidun--space .yidun_icon-point{width:29px;height:29px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -646px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light.yidun--space .yidun_icon-point{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -643px;background-size:40px 1515px}}.yidun.yidun--light.yidun--maxerror .yidun_icon-point{cursor:default}.yidun.yidun--light .yidun_inference{display:none;position:absolute;width:25%;height:50%;overflow:hidden;box-sizing:border-box;background-color:transparent}.yidun.yidun--light .yidun_inference .yidun_inference__border{display:block;position:absolute;top:0;left:0;bottom:0;right:0;z-index:1;border:1px solid #fff;box-sizing:border-box;background:transparent;border-radius:inherit;transition:border .2s ease-out 0s}.yidun.yidun--light .yidun_inference.yidun_inference--0,.yidun.yidun--light .yidun_inference.yidun_inference--0 .yidun_inference__img{top:0;left:0}.yidun.yidun--light .yidun_inference.yidun_inference--1{top:0;left:25%}.yidun.yidun--light .yidun_inference.yidun_inference--1 .yidun_inference__img{top:0;left:-100%}.yidun.yidun--light .yidun_inference.yidun_inference--2{top:0;left:50%}.yidun.yidun--light .yidun_inference.yidun_inference--2 .yidun_inference__img{top:0;left:-200%}.yidun.yidun--light .yidun_inference.yidun_inference--3{top:0;left:75%}.yidun.yidun--light .yidun_inference.yidun_inference--3 .yidun_inference__img{top:0;left:-300%}.yidun.yidun--light .yidun_inference.yidun_inference--4,.yidun.yidun--light .yidun_inference.yidun_inference--4 .yidun_inference__img{bottom:0;left:0}.yidun.yidun--light .yidun_inference.yidun_inference--5{bottom:0;left:25%}.yidun.yidun--light .yidun_inference.yidun_inference--5 .yidun_inference__img{bottom:0;left:-100%}.yidun.yidun--light .yidun_inference.yidun_inference--6{bottom:0;left:50%}.yidun.yidun--light .yidun_inference.yidun_inference--6 .yidun_inference__img{bottom:0;left:-200%}.yidun.yidun--light .yidun_inference.yidun_inference--7{bottom:0;left:75%}.yidun.yidun--light .yidun_inference.yidun_inference--7 .yidun_inference__img{bottom:0;left:-300%}.yidun.yidun--light .yidun_inference.yidun_inference--drag .yidun_inference__border,.yidun.yidun--light .yidun_inference.yidun_inference--swap .yidun_inference__border,.yidun.yidun--light .yidun_inference:hover .yidun_inference__border{border-color:#2c6eff;border-width:2px}.yidun.yidun--light .yidun_inference.yidun_inference--drag,.yidun.yidun--light .yidun_inference:hover{background-color:#fff}.yidun.yidun--light .yidun_inference.yidun_inference--drag .yidun_inference__img,.yidun.yidun--light .yidun_inference:hover .yidun_inference__img{opacity:.3;filter:alpha(opacity=30)}.yidun.yidun--light .yidun_inference:hover{cursor:pointer}.yidun.yidun--light .yidun_inference.yidun_inference--drag{z-index:1;box-shadow:0 2px 6px 30%}.yidun.yidun--light .yidun_inference.yidun_inference--origin .yidun_inference__border{background-color:#d8d8d8}.yidun.yidun--light .yidun_inference.yidun_inference--swap .yidun_inference__border{background:transparent}.yidun.yidun--light .yidun_inference__img{position:absolute;width:400%;height:200%;transition:opacity .2s ease-out}.yidun.yidun--light.yidun--inference .yidun_inference{display:block;background-color:#fff}.yidun.yidun--light.yidun--inference .yidun_bg-img{display:none}.yidun.yidun--light.yidun--sms .yidun_smsbox{display:block}.yidun.yidun--light.yidun--sms .yidun_smsbox~.yidun_bg-img{display:none}.yidun.yidun--light.yidun--float .yidun_panel{display:none;position:absolute;left:0;width:100%;z-index:999}.yidun.yidun--light .yidun_panel{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;z-index:1}.yidun.yidun--light .yidun_panel-placeholder{pointer-events:auto;position:relative;padding-top:50%}.yidun.yidun--light .yidun_bgimg{pointer-events:auto;position:absolute;top:0;left:0;width:100%;height:100%}.yidun.yidun--light .yidun_bgimg .yidun_bg-img{vertical-align:top;width:100%}.yidun.yidun--light .yidun_smsbox{width:100%;height:100%;text-align:left;font-size:0;background:#f8f9fb;background:linear-gradient(103.18deg,#dae3f6 7.63%,#c8d9fa 94.65%);display:none;position:relative;color:#45494c}.yidun.yidun--light .yidun_smsbox .yidun_smsbox-qrcode{width:120px;height:100px;padding:0 10px;position:absolute;left:0;top:0;bottom:0;margin:auto 0;z-index:1}.yidun.yidun--light .yidun_smsbox .yidun_smsbox-qrcode .yidun_smsbox-qrcode--img{width:100%;height:100%;padding:2px;background:#fff}.yidun.yidun--light .yidun_smsbox .yidun_smsbox-text{position:absolute;left:0;top:0;bottom:0;right:0;padding:0 0 0 120px;font-size:14px;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;white-space:nowrap;z-index:1}.yidun.yidun--light .yidun_smsbox .yidun_smsbox-text:before{content:"";width:0;display:inline-block;vertical-align:middle;height:100%}.yidun.yidun--light .yidun_smsbox .yidun_smsbox-text .yidun_smsbox-text--guide{display:inline-block;vertical-align:middle;width:96%;white-space:normal}.yidun.yidun--light .yidun_smsbox .yidun_smsbox-text .yidun_smsbox-text--guide .yidun_smsbox-text--qr{margin-bottom:8px}.yidun.yidun--light .yidun_smsbox .yidun_smsbox-text .yidun_smsbox-text--guide .yidun_smsbox-text--manual{cursor:pointer;color:#176ae5;padding:0}.yidun.yidun--light .yidun_smsbox .yidun_smsbox-text .yidun_smsbox-text--guide .yidun_smsbox-text--manual:after{content:"";display:inline-block;width:16px;height:13px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -186px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light .yidun_smsbox .yidun_smsbox-text .yidun_smsbox-text--guide .yidun_smsbox-text--manual:after{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -183px;background-size:40px 1515px}}.yidun.yidun--light .yidun_smsbox .yidun_smsbox--mobile-wrapper{display:none;padding:9% 20px 0;font-size:14px;white-space:normal}.yidun.yidun--light .yidun_smsbox .yidun_smsbox--mobile-wrapper .yidun_smsbox--mobile-guide{margin-bottom:8px;text-align:center}.yidun.yidun--light .yidun_smsbox .yidun_smsbox--mobile-wrapper .yidun_smsbox--mobile-btn{text-align:center;margin-bottom:10px}.yidun.yidun--light .yidun_smsbox .yidun_smsbox--mobile-wrapper .yidun_smsbox--mobile-btn>a{display:inline-block;padding:8px 16px;background:#176ae5;color:#fff;text-decoration:none;border-radius:4px}.yidun.yidun--light .yidun_smsbox .yidun_smsbox--mobile-wrapper .yidun_smsbox-mobile--manual{width:100%;text-align:center}.yidun.yidun--light .yidun_smsbox .yidun_smsbox--mobile-wrapper .yidun_smsbox-mobile--manual>span{cursor:pointer;color:#176ae5;padding:0}.yidun.yidun--light .yidun_smsbox .yidun_smsbox--mobile-wrapper .yidun_smsbox-mobile--manual>span:after{content:"";display:inline-block;width:16px;height:13px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -186px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light .yidun_smsbox .yidun_smsbox--mobile-wrapper .yidun_smsbox-mobile--manual>span:after{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -183px;background-size:40px 1515px}}.yidun.yidun--light .yidun_smsbox .yidun_smsbox-manual{position:absolute;left:0;top:0;width:100%;height:100%;z-index:1;font-size:14px;padding:0 16px;display:none;white-space:nowrap}.yidun.yidun--light .yidun_smsbox .yidun_smsbox-manual:before{content:"";width:0;display:inline-block;vertical-align:middle;height:100%}.yidun.yidun--light .yidun_smsbox .yidun_smsbox-manual .yidun_smsbox-manual-wrapper{display:inline-block;vertical-align:middle;width:100%;white-space:normal;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.yidun.yidun--light .yidun_smsbox .yidun_smsbox-manual .yidun_smsbox-manual-wrapper .yidun_smsbox-manual--edit{margin-bottom:8px;line-height:26px}.yidun.yidun--light .yidun_smsbox .yidun_smsbox-manual .yidun_smsbox-manual-wrapper .yidun_smsbox-manual--edit .yidun_smsbox-manual--edit-title{display:inline-block;width:66px}.yidun.yidun--light .yidun_smsbox .yidun_smsbox-manual .yidun_smsbox-manual-wrapper .yidun_smsbox-manual--edit .yidun_smsbox-manual--edit-content{font-size:24px;color:#45494c}.yidun.yidun--light .yidun_smsbox .yidun_smsbox-manual .yidun_smsbox-manual-wrapper .yidun_smsbox-manual--send{margin-bottom:10px;display:table}.yidun.yidun--light .yidun_smsbox .yidun_smsbox-manual .yidun_smsbox-manual-wrapper .yidun_smsbox-manual--send .yidun_smsbox-manual--edit-title{min-width:66px;display:table-cell}.yidun.yidun--light .yidun_smsbox .yidun_smsbox-manual .yidun_smsbox-manual-wrapper .yidun_smsbox-manual--send .yidun_smsbox-manual--send-content{display:table-cell}.yidun.yidun--light .yidun_smsbox .yidun_smsbox-manual .yidun_smsbox-manual-wrapper .yidun_smsbox-manual--btn,.yidun.yidun--light .yidun_smsbox .yidun_smsbox-manual .yidun_smsbox-manual-wrapper .yidun_smsbox-manual--qr{cursor:pointer;color:#176ae5;padding:0}.yidun.yidun--light .yidun_smsbox .yidun_smsbox-manual .yidun_smsbox-manual-wrapper .yidun_smsbox-manual--btn:after,.yidun.yidun--light .yidun_smsbox .yidun_smsbox-manual .yidun_smsbox-manual-wrapper .yidun_smsbox-manual--qr:after{content:"";display:inline-block;width:16px;height:13px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -186px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light .yidun_smsbox .yidun_smsbox-manual .yidun_smsbox-manual-wrapper .yidun_smsbox-manual--btn:after,.yidun.yidun--light .yidun_smsbox .yidun_smsbox-manual .yidun_smsbox-manual-wrapper .yidun_smsbox-manual--qr:after{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -183px;background-size:40px 1515px}}.yidun.yidun--light .yidun_smsbox.yidun_smsbox--manual.yidun_smsbox--mobile .yidun_smsbox--mobile-wrapper,.yidun.yidun--light .yidun_smsbox.yidun_smsbox--manual .yidun_smsbox-qrcode,.yidun.yidun--light .yidun_smsbox.yidun_smsbox--manual .yidun_smsbox-text{display:none}.yidun.yidun--light .yidun_smsbox.yidun_smsbox--manual .yidun_smsbox-manual{display:block}.yidun.yidun--light .yidun_smsbox.yidun_smsbox--mobile .yidun_smsbox-qrcode,.yidun.yidun--light .yidun_smsbox.yidun_smsbox--mobile .yidun_smsbox-text{display:none}.yidun.yidun--light .yidun_smsbox.yidun_smsbox--mobile .yidun_smsbox--mobile-wrapper{display:block}.yidun.yidun--light.yidun--icon_point .yidun_bgimg,.yidun.yidun--light.yidun--icon_point .yidun_panel-placeholder,.yidun.yidun--light.yidun--inference .yidun_bgimg,.yidun.yidun--light.yidun--inference .yidun_panel-placeholder,.yidun.yidun--light.yidun--point .yidun_bgimg,.yidun.yidun--light.yidun--point .yidun_panel-placeholder,.yidun.yidun--light.yidun--space .yidun_bgimg,.yidun.yidun--light.yidun--space .yidun_panel-placeholder,.yidun.yidun--light.yidun--word_order .yidun_bgimg,.yidun.yidun--light.yidun--word_order .yidun_panel-placeholder{overflow:hidden}.yidun.yidun--light .yidun_voice{display:none}.yidun.yidun--light.yidun--voice .yidun_voice{display:block;width:100%;height:100%;overflow:hidden;position:relative}.yidun.yidun--light.yidun--voice .yidun_top,.yidun.yidun--light.yidun--voice .yidun_top__audio{display:none}.yidun.yidun--light.yidun--voice .yidun_bgimg{background-color:#f8f9fb;border:1px solid #e6e7eb;padding:0 8px}.yidun.yidun--light.yidun--voice .yidun_bg-img,.yidun.yidun--light.yidun--voice .yidun_jigsaw{display:none}.yidun.yidun--light.yidun--voice .yidun_control{background-color:#e9edf3;border-color:#e9edf3;cursor:pointer}.yidun.yidun--light.yidun--voice .yidun_control[role=button] .yidun_tips{color:#45494c}.yidun.yidun--light.yidun--voice .yidun_tips,.yidun.yidun--light.yidun--voice .yidun_tips .yidun_tips__content{font-size:inherit}.yidun.yidun--light.yidun--voice .yidun_voice-280 .yidun_audio{margin-bottom:6px}.yidun.yidun--light.yidun--voice .yidun_voice-280 .yidun_voice__btns{margin-top:4px}.yidun.yidun--light.yidun--voice .yidun_voice-280 .yidun_audio__play,.yidun.yidun--light.yidun--voice .yidun_voice-280 .yidun_audio__refresh{width:40px;height:40px}.yidun.yidun--light.yidun--voice .yidun_voice-280 .yidun_voice__input{padding:0}.yidun.yidun--light.yidun--voice .yidun_voice-240 .yidun_audio{margin-bottom:2px}.yidun.yidun--light.yidun--voice .yidun_voice-240 .yidun_voice__btns{margin-top:0}.yidun.yidun--light .yidun_audio{height:40px;margin-bottom:24px;position:relative;text-align:center}.yidun.yidun--light .yidun_audio__wave{pointer-events:none;position:absolute;top:0;left:50%;transform:translateX(-50%);z-index:-1;white-space:nowrap;height:100%;line-height:40px;font-size:0}.yidun.yidun--light .yidun_wave__item{display:inline-block;width:4px;height:10px;border-radius:3px;position:relative;overflow:hidden;background-color:#dfe6f4;vertical-align:middle;margin:0 3px}.yidun.yidun--light .yidun_wave__item.yidun_wave__item-light .yidun_wave__inner{transform:translateX(0);transition:transform .35s linear}.yidun.yidun--light .yidun_wave__inner{position:absolute;top:0;left:0;width:4px;height:100%;border-radius:3px;transform:translateX(-4px);background-color:#1991fa}.yidun.yidun--light .yidun_wave-1{height:12px}.yidun.yidun--light .yidun_wave-2{height:18px}.yidun.yidun--light .yidun_wave-3{height:24px}.yidun.yidun--light .yidun_wave-4,.yidun.yidun--light .yidun_wave-5{height:30px}.yidun.yidun--light .yidun_wave-6{height:24px}.yidun.yidun--light .yidun_wave-7{height:18px}.yidun.yidun--light .yidun_wave-8{height:12px}.yidun.yidun--light .yidun_wave-9,.yidun.yidun--light .yidun_wave-10{height:6px}.yidun.yidun--light .yidun_wave-11{height:12px}.yidun.yidun--light .yidun_wave-12{height:18px}.yidun.yidun--light .yidun_wave-13{height:24px}.yidun.yidun--light .yidun_wave-14,.yidun.yidun--light .yidun_wave-15{height:30px}.yidun.yidun--light .yidun_wave-16{height:24px}.yidun.yidun--light .yidun_wave-17{height:18px}.yidun.yidun--light .yidun_wave-18{height:12px}.yidun.yidun--light .yidun_wave-19,.yidun.yidun--light .yidun_wave-20{height:6px}.yidun.yidun--light .yidun_wave-21{height:12px}.yidun.yidun--light .yidun_wave-22{height:18px}.yidun.yidun--light .yidun_wave-23{height:24px}.yidun.yidun--light .yidun_wave-24,.yidun.yidun--light .yidun_wave-25{height:30px}.yidun.yidun--light .yidun_wave-26{height:24px}.yidun.yidun--light .yidun_wave-27{height:18px}.yidun.yidun--light .yidun_wave-28{height:12px}.yidun.yidun--light .yidun_wave-29,.yidun.yidun--light .yidun_wave-30{height:6px}.yidun.yidun--light .yidun_audio__play,.yidun.yidun--light .yidun_audio__refresh{width:40px;height:40px;background-color:#0776f8;box-shadow:0 3px 16px rgba(73,103,180,.32);border:none;outline:none;font-size:0;vertical-align:middle;border-radius:50%;margin:0 16px}.yidun.yidun--light .yidun_audio__play:hover,.yidun.yidun--light .yidun_audio__refresh:hover{background-color:#1991fa;cursor:pointer}.yidun.yidun--light .yidun_audio__play:before,.yidun.yidun--light .yidun_audio__refresh:before{content:"";width:20px;height:20px;display:block;margin:auto}.yidun.yidun--light .yidun_audio__play:before{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -324px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light .yidun_audio__play:before{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -321px;background-size:40px 1515px}}.yidun.yidun--light .yidun_audio__refresh:before{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -299px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light .yidun_audio__refresh:before{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -296px;background-size:40px 1515px}}.yidun.yidun--light .yidun_audio__source,.yidun.yidun--light .yidun_audio__txt{display:none}.yidun.yidun--light .yidun_voice__inner{position:absolute;top:50%;width:100%;transform:translateY(-50%)}.yidun.yidun--light .yidun_voice__input{-moz-appearance:none;width:calc(100% - 4px);height:32px;line-height:30px;font-size:14px;border:1px solid;border-radius:2px;-webkit-appearance:none;text-indent:4px;border-color:#e6e7eb;background-color:#fff;color:#44494a;padding:2px}.yidun.yidun--light .yidun_voice__input:-ms-input-placeholder{color:#c7c7c7}.yidun.yidun--light .yidun_voice__input::placeholder{color:#c7c7c7}.yidun.yidun--light .yidun_voice__input:focus{border-color:#4997fd}.yidun.yidun--light .yidun_voice__btns{text-align:left;margin-top:6px}.yidun.yidun--light .yidun_voice__back,.yidun.yidun--light .yidun_voice__refresh{color:#45494c}.yidun.yidun--light .yidun_voice__back:before,.yidun.yidun--light .yidun_voice__refresh:before{content:"";display:inline-block;width:20px;height:20px;background-repeat:no-repeat;background-position:50%;vertical-align:middle;margin-right:4px}.yidun.yidun--light .yidun_voice__back span,.yidun.yidun--light .yidun_voice__refresh span{vertical-align:middle}.yidun.yidun--light .yidun_voice__refresh:before{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -274px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light .yidun_voice__refresh:before{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -271px;background-size:40px 1515px}}.yidun.yidun--light .yidun_voice__back,.yidun.yidun--light .yidun_voice__refresh{border:none;background:transparent;font-size:12px;line-height:20px;padding:0;cursor:pointer;vertical-align:middle}.yidun.yidun--light .yidun_voice__back{display:none}.yidun.yidun--light .yidun_voice__back:before{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -399px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light .yidun_voice__back:before{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -396px;background-size:40px 1515px}}.yidun.yidun--light .yidun_voice__right{float:right}.yidun.yidun--light .yidun_loadbox{display:none;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;background-image:url("https://cstaticdun.126.net/2.23.0/images/tipBg.ea0d5cf.png");background-color:#f7f9fa;background-position:50%;background-size:cover}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light .yidun_loadbox{background-image:url("https://cstaticdun.126.net/2.23.0/images/tipBg@2x.b36c7c5.png")}}.yidun.yidun--light .yidun_loadbox .yidun_loadbox__inner{position:relative;top:50%;margin-top:-25px}.yidun.yidun--light .yidun_loadbox .yidun_loadbox__inner .yidun_loadicon{width:32px;height:32px;background-repeat:no-repeat}.yidun.yidun--light .yidun_loadbox .yidun_loadbox__inner .yidun_loadtext{display:block;line-height:20px;color:#45494c}.yidun.yidun--light .yidun_top{position:absolute;right:0;top:0;max-width:98px;*max-width:68px;z-index:2;background-color:rgba(0,0,0,.12);*background-color:transparent;_background-color:transparent}.yidun.yidun--light .yidun_top:hover{background-color:rgba(0,0,0,.2);*background-color:transparent;_background-color:transparent}.yidun.yidun--light .yidun_top__right{float:right}.yidun.yidun--light .yidun_refresh,.yidun.yidun--light .yidun_top__audio{width:30px;height:30px;margin-left:4px;cursor:pointer;font-size:0;vertical-align:top;text-indent:-9999px;text-transform:capitalize;border:none;background-color:transparent}.yidun.yidun--light .yidun_refresh{float:left;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -750px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light .yidun_refresh{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -747px;background-size:40px 1515px}}.yidun.yidun--light .yidun_refresh:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -785px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light .yidun_refresh:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -782px;background-size:40px 1515px}}.yidun.yidun--light .yidun_top__audio{float:right;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -820px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light .yidun_top__audio{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -817px;background-size:40px 1515px}}.yidun.yidun--light .yidun_top__audio:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -925px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light .yidun_top__audio:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -922px;background-size:40px 1515px}}.yidun.yidun--light.yidun--maxerror .yidun_refresh{cursor:not-allowed}.yidun.yidun--light.yidun--maxerror .yidun_refresh:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -750px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light.yidun--maxerror .yidun_refresh:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -747px;background-size:40px 1515px}}.yidun.yidun--light.yidun--maxerror .yidun_top__audio{cursor:not-allowed}.yidun.yidun--light.yidun--maxerror .yidun_top__audio:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -820px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light.yidun--maxerror .yidun_top__audio:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -817px;background-size:40px 1515px}}.yidun.yidun--light .yidun_feedback{float:left;display:block;width:30px;height:30px;cursor:pointer;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -615px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light .yidun_feedback{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -612px;background-size:40px 1515px}}.yidun.yidun--light .yidun_feedback:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -715px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light .yidun_feedback:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -712px;background-size:40px 1515px}}.yidun.yidun--light .yidun_feedback_txt{font-size:0;clip:rect(0,0,0,0);-webkit-clip-path:inset(0 0 99.9% 99.9%);clip-path:inset(0 0 99.9% 99.9%)}.yidun.yidun--light .yidun_control{position:relative;border:1px solid #e4e7eb;background-color:#f7f9fa}.yidun.yidun--light .yidun_control.yidun_control--moving .yidun_slide_indicator{border-color:#1991fa;background-color:#d1e9fe}.yidun.yidun--light .yidun_control.yidun_control--moving .yidun_slider{background-color:#1991fa}.yidun.yidun--light .yidun_control.yidun_control--moving .yidun_slider .yidun_slider__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -30px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light .yidun_control.yidun_control--moving .yidun_slider .yidun_slider__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -30px;background-size:40px 1515px}}.yidun.yidun--light .yidun_slide_indicator{position:absolute;top:-1px;left:-1px;width:0;border:1px solid transparent}.yidun.yidun--light .yidun_slider{position:absolute;top:0;left:0;height:100%;background-color:#fff;box-shadow:0 0 3px rgba(0,0,0,.3);cursor:pointer;transition:background .2s linear}.yidun.yidun--light .yidun_slider.yidun_slider--hover:hover{background-color:#1991fa}.yidun.yidun--light .yidun_slider.yidun_slider--hover:hover .yidun_slider__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -30px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light .yidun_slider.yidun_slider--hover:hover .yidun_slider__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -30px;background-size:40px 1515px}}.yidun.yidun--light .yidun_slider .yidun_slider__icon{position:absolute;top:50%;margin-top:-6px;left:50%;margin-left:-6px;width:14px;height:10px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -15px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light .yidun_slider .yidun_slider__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -15px;background-size:40px 1515px}}.yidun.yidun--light .yidun_slider img.yidun_slider__icon{width:100%;height:100%;top:0;left:0;margin:0;background-image:none!important}.yidun.yidun--light .yidun_tips{text-align:center;color:#45494c;height:100%;white-space:nowrap;font-size:0}.yidun.yidun--light .yidun_tips .yidun_sms-counter{color:#1991fa}.yidun.yidun--light .yidun_tips__before{height:100%;width:0;vertical-align:middle}.yidun.yidun--light .yidun_tips__content{display:inline-block;vertical-align:middle;white-space:normal;font-size:14px;line-height:18px}.yidun.yidun--light .yidun_tips__text{vertical-align:middle;word-break:break-word}.yidun.yidun--light .yidun_tips__answer{vertical-align:middle;font-weight:700}.yidun.yidun--light .yidun_tips__answer.hide{display:none}.yidun.yidun--light.yidun--point .yidun_tips__point{display:inline}.yidun.yidun--light.yidun--point .yidun_tips__img,.yidun.yidun--light.yidun--space .yidun_tips__answer,.yidun.yidun--light.yidun--space .yidun_tips__img,.yidun.yidun--light.yidun--space .yidun_tips__point,.yidun.yidun--light.yidun--word_order .yidun_tips__answer,.yidun.yidun--light.yidun--word_order .yidun_tips__img,.yidun.yidun--light.yidun--word_order .yidun_tips__point{display:none}.yidun.yidun--light.yidun--icon_point .yidun_tips__answer{width:80px;height:19px;margin-left:8px;overflow:hidden;position:relative}.yidun.yidun--light.yidun--icon_point .yidun_tips__point{display:none}.yidun.yidun--light.yidun--icon_point .yidun_tips__img{display:block;position:absolute;top:-161px;left:0;width:400%}.yidun.yidun--light.yidun--loadfail .yidun_bgimg,.yidun.yidun--light.yidun--loading .yidun_bgimg{display:none}.yidun.yidun--light.yidun--loadfail .yidun_loadbox,.yidun.yidun--light.yidun--loading .yidun_loadbox{display:block}.yidun.yidun--light.yidun--loadfail .yidun_slider,.yidun.yidun--light.yidun--loading .yidun_slider{cursor:not-allowed}.yidun.yidun--light.yidun--loadfail .yidun_slider:hover,.yidun.yidun--light.yidun--loading .yidun_slider:hover{background-color:#fff}.yidun.yidun--light.yidun--loadfail .yidun_slider:hover .yidun_slider__icon,.yidun.yidun--light.yidun--loading .yidun_slider:hover .yidun_slider__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -15px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light.yidun--loadfail .yidun_slider:hover .yidun_slider__icon,.yidun.yidun--light.yidun--loading .yidun_slider:hover .yidun_slider__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -15px;background-size:40px 1515px}}.yidun.yidun--light.yidun--loadfail .yidun_top,.yidun.yidun--light.yidun--loading .yidun_top{display:block}.yidun.yidun--light.yidun--loading .yidun_loadicon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -960px;background-size:40px 1518px;animation:loading .8s linear infinite}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light.yidun--loading .yidun_loadicon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -957px;background-size:40px 1515px}}.yidun.yidun--light.yidun--loading .yidun_refresh,.yidun.yidun--light.yidun--loading .yidun_top__audio{cursor:not-allowed}.yidun.yidun--light.yidun--loading .yidun_control{border-color:#e4e7eb;background-color:#f7f9fa}.yidun.yidun--light.yidun--loadfail .yidun_loadicon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -890px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light.yidun--loadfail .yidun_loadicon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -887px;background-size:40px 1515px}}.yidun.yidun--light.yidun--icon_point.yidun--button .yidun_control,.yidun.yidun--light.yidun--inference.yidun--button .yidun_control,.yidun.yidun--light.yidun--point.yidun--button .yidun_control,.yidun.yidun--light.yidun--space.yidun--button .yidun_control,.yidun.yidun--light.yidun--word_order.yidun--button .yidun_control{cursor:pointer;background:#f7f9fa;background:linear-gradient(180deg,#fff 0,#ebedf0 87%)}.yidun.yidun--light.yidun--icon_point.yidun--button .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--inference.yidun--button .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--point.yidun--button .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--space.yidun--button .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--word_order.yidun--button .yidun_tips .yidun_tips__icon{margin-right:8px;width:20px;height:20px;vertical-align:middle;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -374px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light.yidun--icon_point.yidun--button .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--inference.yidun--button .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--point.yidun--button .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--space.yidun--button .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--word_order.yidun--button .yidun_tips .yidun_tips__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -371px;background-size:40px 1515px}}.yidun.yidun--light.yidun--icon_point.yidun--verifying .yidun_refresh,.yidun.yidun--light.yidun--icon_point.yidun--verifying .yidun_top__audio,.yidun.yidun--light.yidun--inference.yidun--verifying .yidun_refresh,.yidun.yidun--light.yidun--inference.yidun--verifying .yidun_top__audio,.yidun.yidun--light.yidun--jigsaw.yidun--verifying .yidun_refresh,.yidun.yidun--light.yidun--jigsaw.yidun--verifying .yidun_top__audio,.yidun.yidun--light.yidun--point.yidun--verifying .yidun_refresh,.yidun.yidun--light.yidun--point.yidun--verifying .yidun_top__audio,.yidun.yidun--light.yidun--word_icon.yidun--verifying .yidun_refresh,.yidun.yidun--light.yidun--word_icon.yidun--verifying .yidun_top__audio{cursor:not-allowed}.yidun.yidun--light.yidun--inference.yidun--verifying .yidun_inference--target .yidun_inference__img{animation:bright .6s ease-in .3s}.yidun.yidun--light.yidun--success .yidun_tips{color:#52ccba}.yidun.yidun--light.yidun--success .yidun_refresh,.yidun.yidun--light.yidun--success .yidun_top__audio{display:none}.yidun.yidun--light.yidun--success.yidun--jigsaw .yidun_control .yidun_slide_indicator{border-color:#52ccba;background-color:#d2f4ef}.yidun.yidun--light.yidun--success.yidun--jigsaw .yidun_control .yidun_slider{background-color:#52ccba}.yidun.yidun--light.yidun--success.yidun--jigsaw .yidun_control .yidun_slider .yidun_slider__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 0;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light.yidun--success.yidun--jigsaw .yidun_control .yidun_slider .yidun_slider__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 0;background-size:40px 1515px}}.yidun.yidun--light.yidun--success.yidun--icon_point .yidun_control,.yidun.yidun--light.yidun--success.yidun--inference .yidun_control,.yidun.yidun--light.yidun--success.yidun--point .yidun_control,.yidun.yidun--light.yidun--success.yidun--sms .yidun_control,.yidun.yidun--light.yidun--success.yidun--space .yidun_control,.yidun.yidun--light.yidun--success.yidun--voice .yidun_control,.yidun.yidun--light.yidun--success.yidun--word_order .yidun_control{border-color:#52ccba;background-color:#d2f4ef}.yidun.yidun--light.yidun--success.yidun--icon_point .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--success.yidun--inference .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--success.yidun--point .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--success.yidun--sms .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--success.yidun--space .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--success.yidun--voice .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--success.yidun--word_order .yidun_tips .yidun_tips__icon{margin-right:5px;width:17px;height:12px;vertical-align:middle;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -111px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light.yidun--success.yidun--icon_point .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--success.yidun--inference .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--success.yidun--point .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--success.yidun--sms .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--success.yidun--space .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--success.yidun--voice .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--success.yidun--word_order .yidun_tips .yidun_tips__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -111px;background-size:40px 1515px}}.yidun.yidun--light.yidun--error .yidun_tips{color:#f57a7a}.yidun.yidun--light.yidun--error.yidun--jigsaw.yidun--maxerror .yidun_slide_indicator,.yidun.yidun--light.yidun--error.yidun--jigsaw.yidun--maxerror .yidun_slider{display:none}.yidun.yidun--light.yidun--error.yidun--jigsaw.yidun--maxerror .yidun_tips{padding-left:0}.yidun.yidun--light.yidun--error.yidun--jigsaw .yidun_control .yidun_slide_indicator{border-color:#f57a7a;background-color:#fce1e1}.yidun.yidun--light.yidun--error.yidun--jigsaw .yidun_control .yidun_slider{background-color:#f57a7a}.yidun.yidun--light.yidun--error.yidun--jigsaw .yidun_control .yidun_slider .yidun_slider__icon{width:12px;height:12px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -94px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light.yidun--error.yidun--jigsaw .yidun_control .yidun_slider .yidun_slider__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -94px;background-size:40px 1515px}}.yidun.yidun--light.yidun--error.yidun--jigsaw .yidun_control .yidun_slider img.yidun_slider__icon{width:100%;height:100%}.yidun.yidun--light.yidun--error.yidun--icon_point .yidun_control,.yidun.yidun--light.yidun--error.yidun--inference .yidun_control,.yidun.yidun--light.yidun--error.yidun--maxerror .yidun_control,.yidun.yidun--light.yidun--error.yidun--point .yidun_control,.yidun.yidun--light.yidun--error.yidun--sms .yidun_control,.yidun.yidun--light.yidun--error.yidun--space .yidun_control,.yidun.yidun--light.yidun--error.yidun--voice .yidun_control,.yidun.yidun--light.yidun--error.yidun--word_order .yidun_control{border-color:#f57a7a;background-color:#fce1e1}.yidun.yidun--light.yidun--error.yidun--icon_point .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--error.yidun--inference .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--error.yidun--maxerror .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--error.yidun--point .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--error.yidun--sms .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--error.yidun--space .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--error.yidun--voice .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--error.yidun--word_order .yidun_tips .yidun_tips__icon{margin-right:5px;width:12px;height:12px;vertical-align:middle;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -77px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light.yidun--error.yidun--icon_point .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--error.yidun--inference .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--error.yidun--maxerror .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--error.yidun--point .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--error.yidun--sms .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--error.yidun--space .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--error.yidun--voice .yidun_tips .yidun_tips__icon,.yidun.yidun--light.yidun--error.yidun--word_order .yidun_tips .yidun_tips__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -77px;background-size:40px 1515px}}.yidun.yidun--light.yidun--error.yidun--maxerror .yidun_tips:hover{cursor:pointer}.yidun.yidun--light.yidun--inference.yidun--error .yidun_inference,.yidun.yidun--light.yidun--inference.yidun--maxerror .yidun_inference,.yidun.yidun--light.yidun--inference.yidun--success .yidun_inference,.yidun.yidun--light.yidun--inference.yidun--verifying .yidun_inference,.yidun.yidun--light.yidun--inference .yidun_bgimg--dragging .yidun_inference{cursor:default}.yidun.yidun--light.yidun--inference.yidun--error .yidun_inference:hover .yidun_inference__border,.yidun.yidun--light.yidun--inference.yidun--maxerror .yidun_inference:hover .yidun_inference__border,.yidun.yidun--light.yidun--inference.yidun--success .yidun_inference:hover .yidun_inference__border,.yidun.yidun--light.yidun--inference.yidun--verifying .yidun_inference:hover .yidun_inference__border,.yidun.yidun--light.yidun--inference .yidun_bgimg--dragging .yidun_inference:hover .yidun_inference__border{content:"";border-color:#fff;border-width:1px}.yidun.yidun--light.yidun--inference.yidun--error .yidun_inference:hover .yidun_inference__img,.yidun.yidun--light.yidun--inference.yidun--maxerror .yidun_inference:hover .yidun_inference__img,.yidun.yidun--light.yidun--inference.yidun--success .yidun_inference:hover .yidun_inference__img,.yidun.yidun--light.yidun--inference.yidun--verifying .yidun_inference:hover .yidun_inference__img,.yidun.yidun--light.yidun--inference .yidun_bgimg--dragging .yidun_inference:hover .yidun_inference__img{opacity:1;filter:alpha(opacity=100)}.yidun.yidun--light.yidun--inference.yidun--error .yidun_inference.yidun_inference--drag .yidun_inference__border,.yidun.yidun--light.yidun--inference.yidun--error .yidun_inference.yidun_inference--swap .yidun_inference__border,.yidun.yidun--light.yidun--inference.yidun--maxerror .yidun_inference.yidun_inference--drag .yidun_inference__border,.yidun.yidun--light.yidun--inference.yidun--maxerror .yidun_inference.yidun_inference--swap .yidun_inference__border,.yidun.yidun--light.yidun--inference.yidun--success .yidun_inference.yidun_inference--drag .yidun_inference__border,.yidun.yidun--light.yidun--inference.yidun--success .yidun_inference.yidun_inference--swap .yidun_inference__border,.yidun.yidun--light.yidun--inference.yidun--verifying .yidun_inference.yidun_inference--drag .yidun_inference__border,.yidun.yidun--light.yidun--inference.yidun--verifying .yidun_inference.yidun_inference--swap .yidun_inference__border,.yidun.yidun--light.yidun--inference .yidun_bgimg--dragging .yidun_inference.yidun_inference--drag .yidun_inference__border,.yidun.yidun--light.yidun--inference .yidun_bgimg--dragging .yidun_inference.yidun_inference--swap .yidun_inference__border{border-color:#2c6eff;border-width:2px}.yidun.yidun--light.yidun--inference .yidun_bgimg--dragging .yidun_inference.yidun_inference--target{background-color:#000}.yidun.yidun--light.yidun--inference .yidun_bgimg--dragging .yidun_inference.yidun_inference--target .yidun_inference__border{border:2px solid #2c6eff}.yidun.yidun--light.yidun--inference .yidun_bgimg--dragging .yidun_inference.yidun_inference--target .yidun_inference__img{opacity:.4;filter:alpha(opacity=40)}.yidun.yidun--light.yidun--voice.yidun--error .yidun_control,.yidun.yidun--light.yidun--voice.yidun--error .yidun_voice__back,.yidun.yidun--light.yidun--voice.yidun--error .yidun_voice__refresh,.yidun.yidun--light.yidun--voice.yidun--maxerror .yidun_control,.yidun.yidun--light.yidun--voice.yidun--maxerror .yidun_voice__back,.yidun.yidun--light.yidun--voice.yidun--maxerror .yidun_voice__refresh,.yidun.yidun--light.yidun--voice.yidun--success .yidun_control,.yidun.yidun--light.yidun--voice.yidun--success .yidun_voice__back,.yidun.yidun--light.yidun--voice.yidun--success .yidun_voice__refresh,.yidun.yidun--light.yidun--voice.yidun--verifying .yidun_control,.yidun.yidun--light.yidun--voice.yidun--verifying .yidun_voice__back,.yidun.yidun--light.yidun--voice.yidun--verifying .yidun_voice__refresh{cursor:not-allowed}.yidun.yidun--light.yidun--rtl{direction:rtl}.yidun.yidun--light.yidun--rtl .yidun_top{left:0;right:auto}.yidun.yidun--light.yidun--rtl .yidun_feedback{float:right;margin-left:4px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -680px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light.yidun--rtl .yidun_feedback{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -677px;background-size:40px 1515px}}.yidun.yidun--light.yidun--rtl .yidun_feedback:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -855px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light.yidun--rtl .yidun_feedback:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -852px;background-size:40px 1515px}}.yidun.yidun--light.yidun--rtl .yidun_top__right{float:left}.yidun.yidun--light.yidun--rtl .yidun_top__audio{float:left;margin-left:0}.yidun.yidun--light.yidun--rtl .yidun_tips__img{top:-181px}.yidun.yidun--light.yidun--rtl .yidun_voice__right{float:left}.yidun.yidun--light.yidun--rtl .yidun_voice__refresh{float:right}.yidun.yidun--light.yidun--rtl .yidun_audio__play:before{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -349px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light.yidun--rtl .yidun_audio__play:before{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -346px;background-size:40px 1515px}}.yidun.yidun--light.yidun--rtl .yidun_voice__back{margin-left:4px}.yidun.yidun--light.yidun--rtl .yidun_voice__back:before{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -424px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--light.yidun--rtl .yidun_voice__back:before{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -421px;background-size:40px 1515px}}.yidun.yidun--light.yidun--rtl .yidun_voice__back:before,.yidun.yidun--light.yidun--rtl .yidun_voice__refresh:before{margin-left:2px;margin-right:0}.yidun.yidun--light.yidun--rtl .yidun_wave__inner{transform:translateX(4px)}.yidun.yidun--light.yidun--disable-focus-outline .yidun_control,.yidun.yidun--light.yidun--disable-focus-outline .yidun_feedback,.yidun.yidun--light.yidun--disable-focus-outline .yidun_refresh,.yidun.yidun--light.yidun--disable-focus-outline .yidun_top__audio,.yidun.yidun--light.yidun--disable-focus-outline .yidun_voice__back,.yidun.yidun--light.yidun--disable-focus-outline .yidun_voice__input,.yidun.yidun--light.yidun--disable-focus-outline .yidun_voice__refresh{-webkit-tap-highlight-color:rgba(255,255,255,0)!important;outline:none!important}.yidun.yidun--size-medium{font-size:18px}.yidun.yidun--size-medium .yidun_tips__content{font-size:18px;line-height:19px}.yidun.yidun--size-medium .yidun_top{max-width:116px}.yidun.yidun--size-medium .yidun_refresh,.yidun.yidun--size-medium .yidun_top__audio{width:36px;height:36px}.yidun.yidun--size-medium .yidun_refresh{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1392px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-medium .yidun_refresh{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1389px;background-size:40px 1515px}}.yidun.yidun--size-medium .yidun_refresh:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1187px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-medium .yidun_refresh:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1184px;background-size:40px 1515px}}.yidun.yidun--size-medium .yidun_top__audio{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1269px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-medium .yidun_top__audio{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1266px;background-size:40px 1515px}}.yidun.yidun--size-medium .yidun_top__audio:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1351px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-medium .yidun_top__audio:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1348px;background-size:40px 1515px}}.yidun.yidun--size-medium .yidun_feedback{width:36px;height:36px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1228px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-medium .yidun_feedback{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1225px;background-size:40px 1515px}}.yidun.yidun--size-medium .yidun_feedback:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1310px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-medium .yidun_feedback:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1307px;background-size:40px 1515px}}.yidun.yidun--size-medium .yidun_control.yidun_control--moving .yidun_slider .yidun_slider__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -128px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-medium .yidun_control.yidun_control--moving .yidun_slider .yidun_slider__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -128px;background-size:40px 1515px}}.yidun.yidun--size-medium .yidun_control .yidun_slider:hover .yidun_slider__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -128px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-medium .yidun_control .yidun_slider:hover .yidun_slider__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -128px;background-size:40px 1515px}}.yidun.yidun--size-medium .yidun_control .yidun_slider .yidun_slider__icon{margin-left:-9px;width:20px;height:14px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -147px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-medium .yidun_control .yidun_slider .yidun_slider__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -146px;background-size:40px 1515px}}.yidun.yidun--size-medium.yidun--success.yidun--jigsaw .yidun_control .yidun_slider .yidun_slider__icon{margin-top:-12px;margin-left:-12px;width:24px;height:24px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -586px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-medium.yidun--success.yidun--jigsaw .yidun_control .yidun_slider .yidun_slider__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -583px;background-size:40px 1515px}}.yidun.yidun--size-medium.yidun--success.yidun--icon_point .yidun_tips .yidun_tips__icon,.yidun.yidun--size-medium.yidun--success.yidun--inference .yidun_tips .yidun_tips__icon,.yidun.yidun--size-medium.yidun--success.yidun--point .yidun_tips .yidun_tips__icon,.yidun.yidun--size-medium.yidun--success.yidun--sms .yidun_tips .yidun_tips__icon,.yidun.yidun--size-medium.yidun--success.yidun--space .yidun_tips .yidun_tips__icon,.yidun.yidun--size-medium.yidun--success.yidun--voice .yidun_tips .yidun_tips__icon,.yidun.yidun--size-medium.yidun--success.yidun--word_order .yidun_tips .yidun_tips__icon{width:22px;height:15px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -166px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-medium.yidun--success.yidun--icon_point .yidun_tips .yidun_tips__icon,.yidun.yidun--size-medium.yidun--success.yidun--inference .yidun_tips .yidun_tips__icon,.yidun.yidun--size-medium.yidun--success.yidun--point .yidun_tips .yidun_tips__icon,.yidun.yidun--size-medium.yidun--success.yidun--sms .yidun_tips .yidun_tips__icon,.yidun.yidun--size-medium.yidun--success.yidun--space .yidun_tips .yidun_tips__icon,.yidun.yidun--size-medium.yidun--success.yidun--voice .yidun_tips .yidun_tips__icon,.yidun.yidun--size-medium.yidun--success.yidun--word_order .yidun_tips .yidun_tips__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -164px;background-size:40px 1515px}}.yidun.yidun--size-medium.yidun--error.yidun--jigsaw .yidun_control .yidun_slider .yidun_slider__icon{width:24px;height:24px;margin-top:-12px;margin-left:-12px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -528px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-medium.yidun--error.yidun--jigsaw .yidun_control .yidun_slider .yidun_slider__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -525px;background-size:40px 1515px}}.yidun.yidun--size-medium.yidun--error.yidun--icon_point .yidun_tips .yidun_tips__icon,.yidun.yidun--size-medium.yidun--error.yidun--inference .yidun_tips .yidun_tips__icon,.yidun.yidun--size-medium.yidun--error.yidun--maxerror .yidun_tips .yidun_tips__icon,.yidun.yidun--size-medium.yidun--error.yidun--point .yidun_tips .yidun_tips__icon,.yidun.yidun--size-medium.yidun--error.yidun--sms .yidun_tips .yidun_tips__icon,.yidun.yidun--size-medium.yidun--error.yidun--space .yidun_tips .yidun_tips__icon,.yidun.yidun--size-medium.yidun--error.yidun--voice .yidun_tips .yidun_tips__icon,.yidun.yidun--size-medium.yidun--error.yidun--word_order .yidun_tips .yidun_tips__icon{width:18px;height:18px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -251px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-medium.yidun--error.yidun--icon_point .yidun_tips .yidun_tips__icon,.yidun.yidun--size-medium.yidun--error.yidun--inference .yidun_tips .yidun_tips__icon,.yidun.yidun--size-medium.yidun--error.yidun--maxerror .yidun_tips .yidun_tips__icon,.yidun.yidun--size-medium.yidun--error.yidun--point .yidun_tips .yidun_tips__icon,.yidun.yidun--size-medium.yidun--error.yidun--sms .yidun_tips .yidun_tips__icon,.yidun.yidun--size-medium.yidun--error.yidun--space .yidun_tips .yidun_tips__icon,.yidun.yidun--size-medium.yidun--error.yidun--voice .yidun_tips .yidun_tips__icon,.yidun.yidun--size-medium.yidun--error.yidun--word_order .yidun_tips .yidun_tips__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -248px;background-size:40px 1515px}}.yidun.yidun--size-medium .yidun_loadbox .yidun_loadbox__inner .yidun_loadicon{width:40px;height:40px}.yidun.yidun--size-medium .yidun_loadbox .yidun_loadbox__inner .yidun_loadtext{line-height:32px}.yidun.yidun--size-medium.yidun--loading .yidun_loadicon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1478px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-medium.yidun--loading .yidun_loadicon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1475px;background-size:40px 1515px}}.yidun.yidun--size-medium.yidun--loadfail .yidun_loadicon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1433px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-medium.yidun--loadfail .yidun_loadicon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1430px;background-size:40px 1515px}}.yidun.yidun--size-medium.yidun--voice .yidun_audio__play,.yidun.yidun--size-medium.yidun--voice .yidun_audio__refresh{width:48px;height:48px}.yidun.yidun--size-medium.yidun--voice .yidun_audio__play:before{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -474px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-medium.yidun--voice .yidun_audio__play:before{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -471px;background-size:40px 1515px}}.yidun.yidun--size-medium.yidun--voice .yidun_audio__refresh:before{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -449px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-medium.yidun--voice .yidun_audio__refresh:before{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -446px;background-size:40px 1515px}}.yidun.yidun--size-medium.yidun--voice .yidun_voice__input{font-size:inherit}.yidun.yidun--size-medium.yidun--voice .yidun_voice__input:-ms-input-placeholder{font-size:inherit}.yidun.yidun--size-medium.yidun--voice .yidun_voice__input::placeholder{font-size:inherit}.yidun.yidun--size-medium.yidun--voice .yidun_voice__btns{text-align:left;margin-top:6px}.yidun.yidun--size-medium.yidun--voice .yidun_voice__btns .yidun_voice__back:before,.yidun.yidun--size-medium.yidun--voice .yidun_voice__btns .yidun_voice__refresh:before{width:24px;height:24px}.yidun.yidun--size-medium.yidun--voice .yidun_voice__btns .yidun_voice__refresh:before{margin-right:5px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -499px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-medium.yidun--voice .yidun_voice__btns .yidun_voice__refresh:before{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -496px;background-size:40px 1515px}}.yidun.yidun--size-medium.yidun--voice .yidun_voice__btns .yidun_voice__back:before{margin-right:5px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -557px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-medium.yidun--voice .yidun_voice__btns .yidun_voice__back:before{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -554px;background-size:40px 1515px}}.yidun.yidun--size-medium.yidun--voice .yidun_voice__btns .yidun_voice__back,.yidun.yidun--size-medium.yidun--voice .yidun_voice__btns .yidun_voice__refresh{font-size:inherit}.yidun.yidun--size-medium.yidun--maxerror .yidun_refresh{cursor:not-allowed}.yidun.yidun--size-medium.yidun--maxerror .yidun_refresh:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1392px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-medium.yidun--maxerror .yidun_refresh:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1389px;background-size:40px 1515px}}.yidun.yidun--size-medium.yidun--maxerror .yidun_top__audio{cursor:not-allowed}.yidun.yidun--size-medium.yidun--maxerror .yidun_top__audio:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1269px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-medium.yidun--maxerror .yidun_top__audio:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1266px;background-size:40px 1515px}}.yidun.yidun--size-large{font-size:20px}.yidun.yidun--size-large .yidun_tips__content{font-size:20px;line-height:21px}.yidun.yidun--size-large .yidun_top{max-width:116px}.yidun.yidun--size-large .yidun_refresh,.yidun.yidun--size-large .yidun_top__audio{width:36px;height:36px}.yidun.yidun--size-large .yidun_refresh{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1392px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-large .yidun_refresh{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1389px;background-size:40px 1515px}}.yidun.yidun--size-large .yidun_refresh:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1187px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-large .yidun_refresh:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1184px;background-size:40px 1515px}}.yidun.yidun--size-large .yidun_top__audio{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1269px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-large .yidun_top__audio{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1266px;background-size:40px 1515px}}.yidun.yidun--size-large .yidun_top__audio:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1351px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-large .yidun_top__audio:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1348px;background-size:40px 1515px}}.yidun.yidun--size-large .yidun_feedback{width:36px;height:36px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1228px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-large .yidun_feedback{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1225px;background-size:40px 1515px}}.yidun.yidun--size-large .yidun_feedback:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1310px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-large .yidun_feedback:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1307px;background-size:40px 1515px}}.yidun.yidun--size-large .yidun_control.yidun_control--moving .yidun_slider .yidun_slider__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -128px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-large .yidun_control.yidun_control--moving .yidun_slider .yidun_slider__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -128px;background-size:40px 1515px}}.yidun.yidun--size-large .yidun_control .yidun_slider:hover .yidun_slider__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -128px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-large .yidun_control .yidun_slider:hover .yidun_slider__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -128px;background-size:40px 1515px}}.yidun.yidun--size-large .yidun_control .yidun_slider .yidun_slider__icon{margin-left:-9px;width:20px;height:14px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -147px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-large .yidun_control .yidun_slider .yidun_slider__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -146px;background-size:40px 1515px}}.yidun.yidun--size-large.yidun--success.yidun--jigsaw .yidun_control .yidun_slider .yidun_slider__icon{margin-top:-12px;margin-left:-12px;width:24px;height:24px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -586px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-large.yidun--success.yidun--jigsaw .yidun_control .yidun_slider .yidun_slider__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -583px;background-size:40px 1515px}}.yidun.yidun--size-large.yidun--success.yidun--icon_point .yidun_tips .yidun_tips__icon,.yidun.yidun--size-large.yidun--success.yidun--inference .yidun_tips .yidun_tips__icon,.yidun.yidun--size-large.yidun--success.yidun--point .yidun_tips .yidun_tips__icon,.yidun.yidun--size-large.yidun--success.yidun--sms .yidun_tips .yidun_tips__icon,.yidun.yidun--size-large.yidun--success.yidun--space .yidun_tips .yidun_tips__icon,.yidun.yidun--size-large.yidun--success.yidun--voice .yidun_tips .yidun_tips__icon,.yidun.yidun--size-large.yidun--success.yidun--word_order .yidun_tips .yidun_tips__icon{width:22px;height:15px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -166px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-large.yidun--success.yidun--icon_point .yidun_tips .yidun_tips__icon,.yidun.yidun--size-large.yidun--success.yidun--inference .yidun_tips .yidun_tips__icon,.yidun.yidun--size-large.yidun--success.yidun--point .yidun_tips .yidun_tips__icon,.yidun.yidun--size-large.yidun--success.yidun--sms .yidun_tips .yidun_tips__icon,.yidun.yidun--size-large.yidun--success.yidun--space .yidun_tips .yidun_tips__icon,.yidun.yidun--size-large.yidun--success.yidun--voice .yidun_tips .yidun_tips__icon,.yidun.yidun--size-large.yidun--success.yidun--word_order .yidun_tips .yidun_tips__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -164px;background-size:40px 1515px}}.yidun.yidun--size-large.yidun--error.yidun--jigsaw .yidun_control .yidun_slider .yidun_slider__icon{width:24px;height:24px;margin-top:-12px;margin-left:-12px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -528px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-large.yidun--error.yidun--jigsaw .yidun_control .yidun_slider .yidun_slider__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -525px;background-size:40px 1515px}}.yidun.yidun--size-large.yidun--error.yidun--icon_point .yidun_tips .yidun_tips__icon,.yidun.yidun--size-large.yidun--error.yidun--inference .yidun_tips .yidun_tips__icon,.yidun.yidun--size-large.yidun--error.yidun--maxerror .yidun_tips .yidun_tips__icon,.yidun.yidun--size-large.yidun--error.yidun--point .yidun_tips .yidun_tips__icon,.yidun.yidun--size-large.yidun--error.yidun--sms .yidun_tips .yidun_tips__icon,.yidun.yidun--size-large.yidun--error.yidun--space .yidun_tips .yidun_tips__icon,.yidun.yidun--size-large.yidun--error.yidun--voice .yidun_tips .yidun_tips__icon,.yidun.yidun--size-large.yidun--error.yidun--word_order .yidun_tips .yidun_tips__icon{width:18px;height:18px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -251px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-large.yidun--error.yidun--icon_point .yidun_tips .yidun_tips__icon,.yidun.yidun--size-large.yidun--error.yidun--inference .yidun_tips .yidun_tips__icon,.yidun.yidun--size-large.yidun--error.yidun--maxerror .yidun_tips .yidun_tips__icon,.yidun.yidun--size-large.yidun--error.yidun--point .yidun_tips .yidun_tips__icon,.yidun.yidun--size-large.yidun--error.yidun--sms .yidun_tips .yidun_tips__icon,.yidun.yidun--size-large.yidun--error.yidun--space .yidun_tips .yidun_tips__icon,.yidun.yidun--size-large.yidun--error.yidun--voice .yidun_tips .yidun_tips__icon,.yidun.yidun--size-large.yidun--error.yidun--word_order .yidun_tips .yidun_tips__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -248px;background-size:40px 1515px}}.yidun.yidun--size-large .yidun_loadbox .yidun_loadbox__inner .yidun_loadicon{width:40px;height:40px}.yidun.yidun--size-large .yidun_loadbox .yidun_loadbox__inner .yidun_loadtext{line-height:32px}.yidun.yidun--size-large.yidun--loading .yidun_loadicon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1478px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-large.yidun--loading .yidun_loadicon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1475px;background-size:40px 1515px}}.yidun.yidun--size-large.yidun--loadfail .yidun_loadicon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1433px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-large.yidun--loadfail .yidun_loadicon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1430px;background-size:40px 1515px}}.yidun.yidun--size-large.yidun--voice .yidun_audio__play,.yidun.yidun--size-large.yidun--voice .yidun_audio__refresh{width:48px;height:48px}.yidun.yidun--size-large.yidun--voice .yidun_audio__play:before{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -474px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-large.yidun--voice .yidun_audio__play:before{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -471px;background-size:40px 1515px}}.yidun.yidun--size-large.yidun--voice .yidun_audio__refresh:before{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -449px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-large.yidun--voice .yidun_audio__refresh:before{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -446px;background-size:40px 1515px}}.yidun.yidun--size-large.yidun--voice .yidun_voice__input{font-size:inherit}.yidun.yidun--size-large.yidun--voice .yidun_voice__input:-ms-input-placeholder{font-size:inherit}.yidun.yidun--size-large.yidun--voice .yidun_voice__input::placeholder{font-size:inherit}.yidun.yidun--size-large.yidun--voice .yidun_voice__btns{text-align:left;margin-top:6px}.yidun.yidun--size-large.yidun--voice .yidun_voice__btns .yidun_voice__back:before,.yidun.yidun--size-large.yidun--voice .yidun_voice__btns .yidun_voice__refresh:before{width:24px;height:24px}.yidun.yidun--size-large.yidun--voice .yidun_voice__btns .yidun_voice__refresh:before{margin-right:5px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -499px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-large.yidun--voice .yidun_voice__btns .yidun_voice__refresh:before{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -496px;background-size:40px 1515px}}.yidun.yidun--size-large.yidun--voice .yidun_voice__btns .yidun_voice__back:before{margin-right:5px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -557px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-large.yidun--voice .yidun_voice__btns .yidun_voice__back:before{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -554px;background-size:40px 1515px}}.yidun.yidun--size-large.yidun--voice .yidun_voice__btns .yidun_voice__back,.yidun.yidun--size-large.yidun--voice .yidun_voice__btns .yidun_voice__refresh{font-size:inherit}.yidun.yidun--size-large.yidun--maxerror .yidun_refresh{cursor:not-allowed}.yidun.yidun--size-large.yidun--maxerror .yidun_refresh:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1392px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-large.yidun--maxerror .yidun_refresh:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1389px;background-size:40px 1515px}}.yidun.yidun--size-large.yidun--maxerror .yidun_top__audio{cursor:not-allowed}.yidun.yidun--size-large.yidun--maxerror .yidun_top__audio:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1269px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-large.yidun--maxerror .yidun_top__audio:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1266px;background-size:40px 1515px}}.yidun.yidun--size-x-large,.yidun.yidun--size-x-large .yidun_tips__content{font-size:24px}.yidun.yidun--size-x-large .yidun_top{max-width:116px}.yidun.yidun--size-x-large .yidun_refresh,.yidun.yidun--size-x-large .yidun_top__audio{width:36px;height:36px}.yidun.yidun--size-x-large .yidun_refresh{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1392px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-x-large .yidun_refresh{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1389px;background-size:40px 1515px}}.yidun.yidun--size-x-large .yidun_refresh:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1187px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-x-large .yidun_refresh:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1184px;background-size:40px 1515px}}.yidun.yidun--size-x-large .yidun_top__audio{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1269px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-x-large .yidun_top__audio{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1266px;background-size:40px 1515px}}.yidun.yidun--size-x-large .yidun_top__audio:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1351px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-x-large .yidun_top__audio:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1348px;background-size:40px 1515px}}.yidun.yidun--size-x-large .yidun_feedback{width:36px;height:36px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1228px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-x-large .yidun_feedback{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1225px;background-size:40px 1515px}}.yidun.yidun--size-x-large .yidun_feedback:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1310px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-x-large .yidun_feedback:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1307px;background-size:40px 1515px}}.yidun.yidun--size-x-large .yidun_control.yidun_control--moving .yidun_slider .yidun_slider__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -128px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-x-large .yidun_control.yidun_control--moving .yidun_slider .yidun_slider__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -128px;background-size:40px 1515px}}.yidun.yidun--size-x-large .yidun_control .yidun_slider:hover .yidun_slider__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -128px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-x-large .yidun_control .yidun_slider:hover .yidun_slider__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -128px;background-size:40px 1515px}}.yidun.yidun--size-x-large .yidun_control .yidun_slider .yidun_slider__icon{margin-left:-9px;width:20px;height:14px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -147px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-x-large .yidun_control .yidun_slider .yidun_slider__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -146px;background-size:40px 1515px}}.yidun.yidun--size-x-large.yidun--success.yidun--jigsaw .yidun_control .yidun_slider .yidun_slider__icon{margin-top:-12px;margin-left:-12px;width:24px;height:24px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -586px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-x-large.yidun--success.yidun--jigsaw .yidun_control .yidun_slider .yidun_slider__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -583px;background-size:40px 1515px}}.yidun.yidun--size-x-large.yidun--success.yidun--icon_point .yidun_tips .yidun_tips__icon,.yidun.yidun--size-x-large.yidun--success.yidun--inference .yidun_tips .yidun_tips__icon,.yidun.yidun--size-x-large.yidun--success.yidun--point .yidun_tips .yidun_tips__icon,.yidun.yidun--size-x-large.yidun--success.yidun--sms .yidun_tips .yidun_tips__icon,.yidun.yidun--size-x-large.yidun--success.yidun--space .yidun_tips .yidun_tips__icon,.yidun.yidun--size-x-large.yidun--success.yidun--voice .yidun_tips .yidun_tips__icon,.yidun.yidun--size-x-large.yidun--success.yidun--word_order .yidun_tips .yidun_tips__icon{width:22px;height:15px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -166px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-x-large.yidun--success.yidun--icon_point .yidun_tips .yidun_tips__icon,.yidun.yidun--size-x-large.yidun--success.yidun--inference .yidun_tips .yidun_tips__icon,.yidun.yidun--size-x-large.yidun--success.yidun--point .yidun_tips .yidun_tips__icon,.yidun.yidun--size-x-large.yidun--success.yidun--sms .yidun_tips .yidun_tips__icon,.yidun.yidun--size-x-large.yidun--success.yidun--space .yidun_tips .yidun_tips__icon,.yidun.yidun--size-x-large.yidun--success.yidun--voice .yidun_tips .yidun_tips__icon,.yidun.yidun--size-x-large.yidun--success.yidun--word_order .yidun_tips .yidun_tips__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -164px;background-size:40px 1515px}}.yidun.yidun--size-x-large.yidun--error.yidun--jigsaw .yidun_control .yidun_slider .yidun_slider__icon{width:24px;height:24px;margin-top:-12px;margin-left:-12px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -528px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-x-large.yidun--error.yidun--jigsaw .yidun_control .yidun_slider .yidun_slider__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -525px;background-size:40px 1515px}}.yidun.yidun--size-x-large.yidun--error.yidun--icon_point .yidun_tips .yidun_tips__icon,.yidun.yidun--size-x-large.yidun--error.yidun--inference .yidun_tips .yidun_tips__icon,.yidun.yidun--size-x-large.yidun--error.yidun--maxerror .yidun_tips .yidun_tips__icon,.yidun.yidun--size-x-large.yidun--error.yidun--point .yidun_tips .yidun_tips__icon,.yidun.yidun--size-x-large.yidun--error.yidun--sms .yidun_tips .yidun_tips__icon,.yidun.yidun--size-x-large.yidun--error.yidun--space .yidun_tips .yidun_tips__icon,.yidun.yidun--size-x-large.yidun--error.yidun--voice .yidun_tips .yidun_tips__icon,.yidun.yidun--size-x-large.yidun--error.yidun--word_order .yidun_tips .yidun_tips__icon{width:18px;height:18px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -251px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-x-large.yidun--error.yidun--icon_point .yidun_tips .yidun_tips__icon,.yidun.yidun--size-x-large.yidun--error.yidun--inference .yidun_tips .yidun_tips__icon,.yidun.yidun--size-x-large.yidun--error.yidun--maxerror .yidun_tips .yidun_tips__icon,.yidun.yidun--size-x-large.yidun--error.yidun--point .yidun_tips .yidun_tips__icon,.yidun.yidun--size-x-large.yidun--error.yidun--sms .yidun_tips .yidun_tips__icon,.yidun.yidun--size-x-large.yidun--error.yidun--space .yidun_tips .yidun_tips__icon,.yidun.yidun--size-x-large.yidun--error.yidun--voice .yidun_tips .yidun_tips__icon,.yidun.yidun--size-x-large.yidun--error.yidun--word_order .yidun_tips .yidun_tips__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -248px;background-size:40px 1515px}}.yidun.yidun--size-x-large .yidun_loadbox .yidun_loadbox__inner .yidun_loadicon{width:40px;height:40px}.yidun.yidun--size-x-large .yidun_loadbox .yidun_loadbox__inner .yidun_loadtext{line-height:32px}.yidun.yidun--size-x-large.yidun--loading .yidun_loadicon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1478px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-x-large.yidun--loading .yidun_loadicon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1475px;background-size:40px 1515px}}.yidun.yidun--size-x-large.yidun--loadfail .yidun_loadicon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1433px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-x-large.yidun--loadfail .yidun_loadicon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1430px;background-size:40px 1515px}}.yidun.yidun--size-x-large.yidun--voice .yidun_audio__play,.yidun.yidun--size-x-large.yidun--voice .yidun_audio__refresh{width:48px;height:48px}.yidun.yidun--size-x-large.yidun--voice .yidun_audio__play:before{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -474px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-x-large.yidun--voice .yidun_audio__play:before{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -471px;background-size:40px 1515px}}.yidun.yidun--size-x-large.yidun--voice .yidun_audio__refresh:before{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -449px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-x-large.yidun--voice .yidun_audio__refresh:before{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -446px;background-size:40px 1515px}}.yidun.yidun--size-x-large.yidun--voice .yidun_voice__input{font-size:inherit}.yidun.yidun--size-x-large.yidun--voice .yidun_voice__input:-ms-input-placeholder{font-size:inherit}.yidun.yidun--size-x-large.yidun--voice .yidun_voice__input::placeholder{font-size:inherit}.yidun.yidun--size-x-large.yidun--voice .yidun_voice__btns{text-align:left;margin-top:6px}.yidun.yidun--size-x-large.yidun--voice .yidun_voice__btns .yidun_voice__back:before,.yidun.yidun--size-x-large.yidun--voice .yidun_voice__btns .yidun_voice__refresh:before{width:24px;height:24px}.yidun.yidun--size-x-large.yidun--voice .yidun_voice__btns .yidun_voice__refresh:before{margin-right:5px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -499px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-x-large.yidun--voice .yidun_voice__btns .yidun_voice__refresh:before{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -496px;background-size:40px 1515px}}.yidun.yidun--size-x-large.yidun--voice .yidun_voice__btns .yidun_voice__back:before{margin-right:5px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -557px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-x-large.yidun--voice .yidun_voice__btns .yidun_voice__back:before{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -554px;background-size:40px 1515px}}.yidun.yidun--size-x-large.yidun--voice .yidun_voice__btns .yidun_voice__back,.yidun.yidun--size-x-large.yidun--voice .yidun_voice__btns .yidun_voice__refresh{font-size:inherit}.yidun.yidun--size-x-large.yidun--maxerror .yidun_refresh{cursor:not-allowed}.yidun.yidun--size-x-large.yidun--maxerror .yidun_refresh:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1392px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-x-large.yidun--maxerror .yidun_refresh:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1389px;background-size:40px 1515px}}.yidun.yidun--size-x-large.yidun--maxerror .yidun_top__audio{cursor:not-allowed}.yidun.yidun--size-x-large.yidun--maxerror .yidun_top__audio:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -1269px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun.yidun--size-x-large.yidun--maxerror .yidun_top__audio:hover{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -1266px;background-size:40px 1515px}}.yidun_popup.yidun_popup--light{position:fixed;top:0;left:0;width:100%;height:100%;z-index:9999;text-align:center}.yidun_popup.yidun_popup--light .yidun_popup__mask{-ms-touch-action:none;touch-action:none;position:absolute;top:0;left:0;width:100%;height:100%;background-color:#000;transition:opacity .3s linear;will-change:opacity}.yidun_popup.yidun_popup--light .yidun_modal{position:relative;box-sizing:border-box;border-radius:2px;border:1px solid #e4e7eb;background-color:#fff;box-shadow:0 0 10px rgba(0,0,0,.3);-ms-touch-action:none;touch-action:none}.yidun_popup.yidun_popup--light .yidun_modal__wrap{height:100%;width:100%}.yidun_popup.yidun_popup--light .yidun_modal__subwrap{height:100%;width:100%;white-space:nowrap}.yidun_popup.yidun_popup--light .yidun_modal__sibling{width:0;height:100%}.yidun_popup.yidun_popup--light .yidun_modal__header{padding:0 15px;height:50px;text-align:left;font-size:0;color:#45494c;border-bottom:1px solid #e4e7eb;white-space:nowrap;position:relative}.yidun_popup.yidun_popup--light .yidun_modal__before{width:0;height:100%;vertical-align:middle}.yidun_popup.yidun_popup--light .yidun_modal__title{font-size:16px;line-height:20px;vertical-align:middle;white-space:normal}.yidun_popup.yidun_popup--light .yidun_modal__close{position:absolute;top:0;right:9px;width:24px;height:100%;text-align:center;border:none;background:transparent;padding:0;cursor:pointer}.yidun_popup.yidun_popup--light .yidun_modal__close:before{content:"";display:inline-block;height:100%;vertical-align:middle;font-size:0}.yidun_popup.yidun_popup--light .yidun_modal__close .yidun_icon-close{display:inline-block;width:11px;height:11px;font-size:0;text-indent:-9999px;text-transform:capitalize;margin:auto;vertical-align:middle;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -61px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun_popup.yidun_popup--light .yidun_modal__close .yidun_icon-close{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -61px;background-size:40px 1515px}}.yidun_popup.yidun_popup--light .yidun_modal__close:hover .yidun_icon-close{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -45px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun_popup.yidun_popup--light .yidun_modal__close:hover .yidun_icon-close{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -45px;background-size:40px 1515px}}.yidun_popup.yidun_popup--light .yidun_modal__body{padding:15px}.yidun_popup.yidun_popup--light .yidun_modal__body .yidun{*margin:0}.yidun_popup.yidun_popup--auto .yidun_modal{top:auto;*top:-50%}.yidun_popup.yidun_popup--auto .yidun_modal__wrap{display:table;*position:relative}.yidun_popup.yidun_popup--auto .yidun_modal__subwrap{display:table-cell;vertical-align:middle;*height:auto;*position:absolute;*top:50%;*left:0}@supports (display:flex){.yidun_popup.yidun_popup--auto .yidun_modal{top:auto;margin:auto}.yidun_popup.yidun_popup--auto .yidun_modal__wrap{display:block}.yidun_popup.yidun_popup--auto .yidun_modal__subwrap{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:center;align-items:center;-ms-flex-line-pack:center;align-content:center}}.yidun_popup.yidun_popup--append{position:absolute}.yidun_popup.yidun_popup--rtl{direction:rtl}.yidun_popup.yidun_popup--rtl .yidun_modal__header{text-align:right;padding:0 15px}.yidun_popup.yidun_popup--rtl .yidun_modal__close{left:9px;right:auto}.yidun_popup.yidun_popup--disable-focus-outline .yidun .yidun_control,.yidun_popup.yidun_popup--disable-focus-outline .yidun .yidun_feedback,.yidun_popup.yidun_popup--disable-focus-outline .yidun .yidun_refresh,.yidun_popup.yidun_popup--disable-focus-outline .yidun .yidun_top__audio,.yidun_popup.yidun_popup--disable-focus-outline .yidun .yidun_voice__back,.yidun_popup.yidun_popup--disable-focus-outline .yidun .yidun_voice__input,.yidun_popup.yidun_popup--disable-focus-outline .yidun .yidun_voice__refresh,.yidun_popup.yidun_popup--disable-focus-outline .yidun_modal,.yidun_popup.yidun_popup--disable-focus-outline .yidun_modal__close{-webkit-tap-highlight-color:rgba(255,255,255,0)!important;outline:none!important}.yidun_popup.yidun_popup--size-medium,.yidun_popup.yidun_popup--size-medium .yidun_modal__title{font-size:18px}.yidun_popup.yidun_popup--size-large,.yidun_popup.yidun_popup--size-large .yidun_modal__title{font-size:20px}.yidun_popup.yidun_popup--size-x-large,.yidun_popup.yidun_popup--size-x-large .yidun_modal__title{font-size:24px}.yidun_intellisense--light{position:relative}.yidun_intellisense--light *{box-sizing:border-box}.yidun_intellisense--light.yidun_intellisense--checking .yidun_intelli-control,.yidun_intellisense--light.yidun_intellisense--loadfail .yidun_intelli-control,.yidun_intellisense--light.yidun_intellisense--loading .yidun_intelli-control,.yidun_intellisense--light.yidun_intellisense--success .yidun_intelli-control{cursor:default}.yidun_intellisense--light .yidun_intelli-control{position:relative;height:40px;font-size:14px;cursor:pointer;border-radius:2px;border:1px solid #e4e7eb;background-color:#f7f9fa;overflow:hidden;outline:none}.yidun_intellisense--light .yidun_intelli-tips{text-align:center;color:#45494c}.yidun_intellisense--light .yidun_intelli-tips:hover .yidun_intelli-icon{background-color:#1991fa;box-shadow:0 2px 6px 1px rgba(25,145,250,.5)}.yidun_intellisense--light .yidun_intelli-tips:hover .yidun_intelli-icon .yidun_logo{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -229px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun_intellisense--light .yidun_intelli-tips:hover .yidun_intelli-icon .yidun_logo{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -226px;background-size:40px 1515px}}.yidun_intellisense--light .yidun_intelli-tips:hover .yidun_intelli-text{color:#1991fa}.yidun_intellisense--light .yidun_intelli-icon{position:relative;margin-right:5px;width:28px;height:28px;vertical-align:middle;border-radius:50%;background-color:#fff;box-shadow:0 2px 8px 1px rgba(188,196,204,.5);transition:all .2s linear}.yidun_intellisense--light .yidun_intelli-icon .yidun_logo{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px;width:15px;height:17px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -207px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun_intellisense--light .yidun_intelli-icon .yidun_logo{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -204px;background-size:40px 1515px}}.yidun_intellisense--light .yidun_intelli-icon img.yidun_logo{width:100%;height:100%;top:0;left:0;margin:0;border-radius:50%;background-image:none!important}.yidun_intellisense--light .yidun_intelli-text{line-height:38px;vertical-align:middle;transition:all .2s linear}.yidun_intellisense--light .yidun_classic-tips{display:none;text-align:center}.yidun_intellisense--light .yidun_classic-tips .yidun_tips__icon{margin-right:5px;width:12px;height:12px;vertical-align:middle}.yidun_intellisense--light .yidun_classic-tips .yidun_tips__text{line-height:38px;vertical-align:middle}.yidun_intellisense--light .yidun_classic-container{position:absolute;bottom:0;left:0;width:100%;z-index:1000}.yidun_intellisense--light .yidun_classic-wrapper{display:none;padding:9px;border:1px solid #e4e7eb;border-radius:2px;background-color:#fff}.yidun_intellisense--light.yidun_intellisense--checking .yidun_intelli-icon,.yidun_intellisense--light.yidun_intellisense--loading .yidun_intelli-icon{background-color:#1991fa}.yidun_intellisense--light.yidun_intellisense--checking .yidun_intelli-icon .yidun_logo,.yidun_intellisense--light.yidun_intellisense--loading .yidun_intelli-icon .yidun_logo{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -229px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun_intellisense--light.yidun_intellisense--checking .yidun_intelli-icon .yidun_logo,.yidun_intellisense--light.yidun_intellisense--loading .yidun_intelli-icon .yidun_logo{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -226px;background-size:40px 1515px}}.yidun_intellisense--light.yidun_intellisense--checking .yidun_intelli-text,.yidun_intellisense--light.yidun_intellisense--loading .yidun_intelli-text{color:#1991fa}.yidun_intellisense--light.yidun_intellisense--checking .yidun_ball-scale-multiple{position:absolute;top:50%;left:50%;transform:translateY(-80px)}.yidun_intellisense--light.yidun_intellisense--checking .yidun_ball-scale-multiple>div:nth-child(2){animation-delay:-1.2s}.yidun_intellisense--light.yidun_intellisense--checking .yidun_ball-scale-multiple>div:nth-child(3){animation-delay:-.6s}.yidun_intellisense--light.yidun_intellisense--checking .yidun_ball-scale-multiple>div{position:absolute;box-shadow:inset 0 0 40px rgba(25,145,250,.5);border-radius:100%;animation-fill-mode:both;left:-80px;top:0;opacity:0;width:160px;height:160px;animation:ball-scale-multiple 1.8s 0s linear infinite}.yidun_intellisense--light.yidun_intellisense--loading .yidun_logo{display:none}.yidun_intellisense--light.yidun_intellisense--loading .yidun_intelli-loading{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px;width:16px;height:16px;border-radius:50%;border-width:2px;border-style:solid;border-color:#fff #fff transparent;animation:loading .75s linear infinite;background-position:0 0}.yidun_intellisense--light.yidun_intellisense--error .yidun_intelli-tips,.yidun_intellisense--light.yidun_intellisense--loadfail .yidun_intelli-tips,.yidun_intellisense--light.yidun_intellisense--success .yidun_intelli-tips{display:none}.yidun_intellisense--light.yidun_intellisense--error .yidun_classic-tips,.yidun_intellisense--light.yidun_intellisense--loadfail .yidun_classic-tips,.yidun_intellisense--light.yidun_intellisense--success .yidun_classic-tips{display:block}.yidun_intellisense--light.yidun_intellisense--success .yidun_intelli-control{border-color:#52ccba;background-color:#d2f4ef}.yidun_intellisense--light.yidun_intellisense--success .yidun_classic-tips{color:#52ccba}.yidun_intellisense--light.yidun_intellisense--success .yidun_tips__icon{width:17px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -111px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun_intellisense--light.yidun_intellisense--success .yidun_tips__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -111px;background-size:40px 1515px}}.yidun_intellisense--light.yidun_intellisense--error .yidun_intelli-control,.yidun_intellisense--light.yidun_intellisense--loadfail .yidun_intelli-control{border-color:#f57a7a;background-color:#fce1e1}.yidun_intellisense--light.yidun_intellisense--error .yidun_classic-tips,.yidun_intellisense--light.yidun_intellisense--loadfail .yidun_classic-tips{color:#f57a7a}.yidun_intellisense--light.yidun_intellisense--error .yidun_tips__icon,.yidun_intellisense--light.yidun_intellisense--loadfail .yidun_tips__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -77px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun_intellisense--light.yidun_intellisense--error .yidun_tips__icon,.yidun_intellisense--light.yidun_intellisense--loadfail .yidun_tips__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -77px;background-size:40px 1515px}}.yidun_intellisense--light.yidun_intellisense--maxerror .yidun_intelli-control .yidun_tips__text:hover{cursor:pointer;text-decoration:underline}.yidun_intellisense--size-medium,.yidun_intellisense--size-medium .yidun_intelli-control{font-size:18px}.yidun_intellisense--size-medium.yidun_intellisense--success .yidun_tips__icon{width:22px;height:15px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -166px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun_intellisense--size-medium.yidun_intellisense--success .yidun_tips__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -164px;background-size:40px 1515px}}.yidun_intellisense--size-medium.yidun_intellisense--error .yidun_tips__icon,.yidun_intellisense--size-medium.yidun_intellisense--loadfail .yidun_tips__icon{width:18px;height:18px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -251px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun_intellisense--size-medium.yidun_intellisense--error .yidun_tips__icon,.yidun_intellisense--size-medium.yidun_intellisense--loadfail .yidun_tips__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -248px;background-size:40px 1515px}}.yidun_intellisense--size-large{font-size:20px}.yidun_intellisense--size-large .yidun_intelli-control{font-size:20px;line-height:19px}.yidun_intellisense--size-large.yidun_intellisense--success .yidun_tips__icon{width:22px;height:15px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -166px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun_intellisense--size-large.yidun_intellisense--success .yidun_tips__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -164px;background-size:40px 1515px}}.yidun_intellisense--size-large.yidun_intellisense--error .yidun_tips__icon,.yidun_intellisense--size-large.yidun_intellisense--loadfail .yidun_tips__icon{width:18px;height:18px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -251px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun_intellisense--size-large.yidun_intellisense--error .yidun_tips__icon,.yidun_intellisense--size-large.yidun_intellisense--loadfail .yidun_tips__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -248px;background-size:40px 1515px}}.yidun_intellisense--size-x-large,.yidun_intellisense--size-x-large .yidun_intelli-control{font-size:24px}.yidun_intellisense--size-x-large.yidun_intellisense--success .yidun_tips__icon{width:22px;height:15px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -166px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun_intellisense--size-x-large.yidun_intellisense--success .yidun_tips__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -164px;background-size:40px 1515px}}.yidun_intellisense--size-x-large.yidun_intellisense--error .yidun_tips__icon,.yidun_intellisense--size-x-large.yidun_intellisense--loadfail .yidun_tips__icon{width:18px;height:18px;background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light.4e88fb8.png");background-position:0 -251px;background-size:40px 1518px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.yidun_intellisense--size-x-large.yidun_intellisense--error .yidun_tips__icon,.yidun_intellisense--size-x-large.yidun_intellisense--loadfail .yidun_tips__icon{background-image:url("https://cstaticdun.126.net/2.23.0/images/icon_light@2x.f3de6ba.png");background-position:0 -248px;background-size:40px 1515px}}

    </style>
    <script async="" charset="UTF-8" src="./mybatis 3.x源码深度解析（五） - 知乎_files/watchman.min.js.下载" type="text/javascript"></script>
</head>
<body aria-basefontsize="16" class="WhiteBg-body PostIndex-body" data-rh="class"><a aria-atomic="true" aria-label="欢迎进入 mybatis 3.x源码深度解析（五） - 知乎,盲人用户使用操作智能引导，请按快捷键Ctrl+Alt+R；阅读详细操作说明请按快捷键Ctrl+Alt+问号键。" class="skipAutoFix" href="javascript:void(0)" id="ariaTipText" role="pagedescription" style="width: 1px; height: 1px;"><img src="https://zhuanlan.zhihu.com/p/66984738?utm_id=0" style="width:1px !important;height:1px !important;position:absolute;top:0;"></a><img alt="" hidden="" src="./mybatis 3.x源码深度解析（五） - 知乎_files/logo.e049e9b9.png">
<div id="root">
    <div class="App">
        <div class="LoadingBar  css-uzm3ri"></div>
        <div><span aria-live="assertive" role="log" style="position:absolute;top:-10000px;left:-10000px"></span></div>
        <main class="App-main" role="main">
            <div class="Post-content" data-za-detail-view-path-module="PostItem" data-za-extra-module="{&quot;card&quot;:{&quot;content&quot;:{&quot;type&quot;:&quot;Post&quot;,&quot;token&quot;:&quot;66984738&quot;}}}" data-zop="{&quot;authorName&quot;:&quot;永恒之魂&quot;,&quot;itemId&quot;:66984738,&quot;title&quot;:&quot;mybatis 3.x源码深度解析（五）&quot;,&quot;type&quot;:&quot;article&quot;}" data-zop-usertoken="{&quot;userToken&quot;:&quot;&quot;}">
                <div class="ColumnPageHeader-Wrapper">
                    <div>
                        <div class="Sticky ColumnPageHeader is-fixed css-1l12z7y" style="width: 1519.2px; top: 0px; left: 0px;">
                            <div class="ColumnPageHeader-content"><a aria-label="知乎" href="https://www.zhihu.com/">
                                <svg class="css-1hlrcxk" fill="#056DE8" height="30" viewBox="0 0 64 30" width="64">
                                    <path d="M29.05 4.582H16.733V25.94h3.018l.403 2.572 4.081-2.572h4.815V4.582zm-5.207 18.69l-2.396 1.509-.235-1.508h-1.724V7.233h6.78v16.04h-2.425zM14.46 14.191H9.982c0-.471.033-.954.039-1.458v-5.5h5.106V5.935a1.352 1.352 0 0 0-.404-.957 1.378 1.378 0 0 0-.968-.396H5.783c.028-.088.056-.177.084-.255.274-.82 1.153-3.326 1.153-3.326a4.262 4.262 0 0 0-2.413.698c-.57.4-.912.682-1.371 1.946-.532 1.453-.997 2.856-1.31 3.693C1.444 8.674.28 11.025.28 11.025a5.85 5.85 0 0 0 2.52-.61c1.119-.593 1.679-1.502 2.054-2.883l.09-.3h2.334v5.5c0 .5-.045.982-.073 1.46h-4.12c-.71 0-1.39.278-1.893.775a2.638 2.638 0 0 0-.783 1.874h6.527a17.717 17.717 0 0 1-.778 3.649 16.796 16.796 0 0 1-3.012 5.273A33.104 33.104 0 0 1 0 28.74s3.13 1.175 5.425-.954c1.388-1.292 2.631-3.814 3.23-5.727a28.09 28.09 0 0 0 1.12-5.229h5.967v-1.37a1.254 1.254 0 0 0-.373-.899 1.279 1.279 0 0 0-.909-.37z"></path>
                                    <path d="M11.27 19.675l-2.312 1.491 5.038 7.458a6.905 6.905 0 0 0 .672-2.218 3.15 3.15 0 0 0-.28-2.168l-3.118-4.563zM51.449 15.195V5.842c4.181-.205 7.988-.405 9.438-.483l.851-.05c.387-.399.885-2.395.689-3.021-.073-.25-.213-.666-.638-.555a33.279 33.279 0 0 1-4.277.727c-2.766.321-3.97.404-7.804.682-6.718.487-12.709.72-12.709.72a2.518 2.518 0 0 0 .788 1.834 2.567 2.567 0 0 0 1.883.706c2.278-.095 5.598-.25 8.996-.41v9.203h-12.78c0 .703.281 1.377.783 1.874a2.69 2.69 0 0 0 1.892.777h10.105v7.075c0 .887-.464 1.192-1.231 1.214h-3.92a4.15 4.15 0 0 0 .837 1.544 4.2 4.2 0 0 0 1.403 1.067 6.215 6.215 0 0 0 2.71.277c1.36-.066 2.967-.826 2.967-3.57v-7.607h11.28c.342 0 .67-.135.91-.374.242-.239.378-.563.378-.902v-1.375H51.449z"></path>
                                    <path d="M42.614 8.873a2.304 2.304 0 0 0-1.508-.926 2.334 2.334 0 0 0-1.727.405l-.376.272 4.255 5.85 2.24-1.62-2.884-3.98zM57.35 8.68l-3.125 4.097 2.24 1.663 4.517-5.927-.375-.277a2.32 2.32 0 0 0-1.722-.452 2.327 2.327 0 0 0-1.536.896z"></path>
                                </svg>
                            </a><i class="ColumnPageHeader-Line"></i>
                                <div class="ColumnPageHeader-Title">
                                    <div class="ColumnPageHeader-TitleName"><span class="ColumnPageHeader-TitleMeta">首发于</span><a class="ColumnLink ColumnPageHeader-TitleColumn" href="https://www.zhihu.com/column/c_1101164296519720960">JAVA CTO之旅</a></div>
                                </div>
                                <div class="ColumnPageHeader-Button">
                                    <div class="Popover">
                                        <div aria-expanded="false" aria-haspopup="true" aria-owns="Popover1-content" class="Button FEfUrdfMIKpQDJDqkjte Button--plain Button--gray fEPKGkUK5jyc4fUuT0QP css-d5yzzu" id="Popover1-toggle" type="button">切换模式</div>
                                    </div>
                                    <button class="Button ColumnPageHeader-WriteButton FEfUrdfMIKpQDJDqkjte Button--blue JmYzaky7MEPMFcJDLNMG" type="button">
                                        <svg class="Zi Zi--EditSurround" fill="currentColor" height="24" viewBox="0 0 24 24" width="24">
                                            <path clip-rule="evenodd" d="M3.55 5.97a2.415 2.415 0 0 1 2.415-2.416h7.56a.75.75 0 0 1 0 1.5h-7.56a.915.915 0 0 0-.915.915v12.072c0 .505.41.915.915.915h12.074c.506 0 .915-.41.915-.915v-7.557a.75.75 0 0 1 1.5 0v7.557a2.415 2.415 0 0 1-2.415 2.415H5.965A2.415 2.415 0 0 1 3.55 18.04V5.969Z" fill-rule="evenodd"></path>
                                            <path clip-rule="evenodd" d="M20.239 3.77a.75.75 0 0 1 0 1.06l-8.206 8.206a.75.75 0 0 1-1.06-1.06l8.205-8.206a.75.75 0 0 1 1.06 0Z" fill-rule="evenodd"></path>
                                        </svg>
                                        写文章
                                    </button>
                                </div>
                            </div>
                            <div class="ColumnPageHeader-profile">
                                <div>
                                    <button class="Button Button--primary Button--blue css-24crel" type="button">登录/注册</button>
                                </div>
                            </div>
                        </div>
                        <div class="Sticky--holder" style="position: relative; inset: 0px; display: block; float: none; margin: 0px; height: 52px;"></div>
                    </div>
                </div>
                <article class="Post-Main Post-NormalMain" tabindex="-1">
                    <header class="Post-Header"><h1 class="Post-Title">mybatis 3.x源码深度解析（五）</h1>
                        <div class="Post-Author">
                            <div class="AuthorInfo" itemprop="author" itemscope="" itemtype="http://schema.org/Person">
                                <div class="AuthorInfo">
                                    <meta content="永恒之魂" itemprop="name">
                                    <meta content="https://pic1.zhimg.com/v2-2856788095527eadbbc0dd5d521840f0_l.jpg?source=172ae18b" itemprop="image">
                                    <meta content="https://www.zhihu.com/people/yong-heng-zhi-hun" itemprop="url">
                                    <meta itemprop="zhihu:followerCount">
                                    <span class="UserLink AuthorInfo-avatarWrapper"><div class="css-1gomreu"><a class="UserLink-link" data-za-detail-view-element_name="User" href="https://www.zhihu.com/people/yong-heng-zhi-hun" target="_blank"><img alt="永恒之魂" class="Avatar AuthorInfo-avatar css-1syywx2" src="./mybatis 3.x源码深度解析（五） - 知乎_files/v2-2856788095527eadbbc0dd5d521840f0_l.jpg" srcset="https://pic1.zhimg.com/v2-2856788095527eadbbc0dd5d521840f0_l.jpg?source=172ae18b 2x"></a></div></span>
                                    <div class="AuthorInfo-content">
                                        <div class="AuthorInfo-head"><span class="UserLink AuthorInfo-name"><div class="css-1gomreu"><a class="UserLink-link" data-za-detail-view-element_name="User" href="https://www.zhihu.com/people/yong-heng-zhi-hun" target="_blank">永恒之魂</a></div></span></div>
                                        <div class="AuthorInfo-detail">
                                            <div class="AuthorInfo-badge">
                                                <div class="ztext AuthorInfo-badgeText css-0">道可道，非常道。</div>
                                            </div>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                        <div class="LabelContainer-wrapper"></div>
                    </header>
                    <div class="Post-RichTextContainer">
                        <div class="css-1yuhvjn">
                            <div class="css-376mun">
                                <div class="RichText ztext Post-RichText css-117anjg" options="[object Object]"><h2 data-first-child=""><b>3 关键对象总结与回顾</b></h2>
                                    <h3><b>3.1 SqlSource</b></h3>
                                    <p data-pid="AcXZE7K1">SqlSource是XML文件或者注解方法中映射语句的实现时表示，通过SqlSourceBuilder.parse()方法创建，SqlSourceBuilder中符号解析器将mybatis中的查询参数#{}转换为?，并记录了参数的顺序。它只有一个方法getBoundSql用于获取映射语句对象的各个组成部分，它的定义如下：</p>
                                    <div class="highlight"><pre><code class="language-text">/**
 * Represents the content of a mapped statement read from an XML file or an annotation. 
 * It creates the SQL that will be passed to the database out of the input parameter received from the user.
 * 代表从XML文件或者注解读取的映射语句的内容,它创建的SQL会被传递给数据库。
 * @author Clinton Begin
 */
public interface SqlSource {

  BoundSql getBoundSql(Object parameterObject);

}</code></pre>
                                    </div>
                                    <p data-pid="MM_ymqyT">根据SQL语句的类型不同，mybatis提供了多种SqlSource的具体实现，如下所示：<br></p>
                                    <figure data-size="normal">
                                        <noscript><img class="origin_image zh-lightbox-thumb" data-caption="" data-original="https://pic2.zhimg.com/v2-8f59bd34e1262ea50cdec8b60bc401bd_r.jpg" data-rawheight="149" data-rawwidth="582" data-size="normal" src="https://pic2.zhimg.com/v2-8f59bd34e1262ea50cdec8b60bc401bd_b.jpg" width="582"/></noscript>
                                        <div><img class="origin_image zh-lightbox-thumb lazy" data-actualsrc="https://pic2.zhimg.com/v2-8f59bd34e1262ea50cdec8b60bc401bd_b.jpg" data-caption="" data-lazy-status="ok" data-original="https://pic2.zhimg.com/v2-8f59bd34e1262ea50cdec8b60bc401bd_r.jpg" data-original-token="v2-a7dd0ded5858b60b8c73c3805ebf43ed" data-rawheight="149" data-rawwidth="582" data-size="normal" height="149" src="./mybatis 3.x源码深度解析（五） - 知乎_files/v2-8f59bd34e1262ea50cdec8b60bc401bd_720w.webp" width="582"></div>
                                    </figure>
                                    <p class="ztext-empty-paragraph"><br></p>
                                    <ul>
                                        <li data-pid="UYLdBZ2o">StaticSqlSource：最终静态SQL语句的封装,其他类型的SqlSource最终都委托给StaticSqlSource。</li>
                                        <li data-pid="1htzClrp">RawSqlSource：原始静态SQL语句的封装,在加载时就已经确定了SQL语句,没有、等动态标签和${} SQL拼接,比动态SQL语句要快,因为不需要运行时解析SQL节点。</li>
                                        <li data-pid="RoBbaEOV">DynamicSqlSource：动态SQL语句的封装，在运行时需要根据参数处理、等标签或者${} SQL拼接之后才能生成最后要执行的静态SQL语句。</li>
                                        <li data-pid="rS9H-3Bj">ProviderSqlSource：当SQL语句通过指定的类和方法获取时(使用@XXXProvider注解)，需要使用本类，它会通过反射调用相应的方法得到SQL语句。</li>
                                    </ul>
                                    <h3><b>3.2 SqlNode</b></h3>
                                    <p data-pid="_06kie6Q">　　SqlNode接口主要用来处理CRUD节点下的各类动态标签比如、，对每个动态标签，mybatis都提供了对应的SqlNode实现，这些动态标签可以相互嵌套且实现上采用单向链表进行应用，这样后面如果需要增加其他动态标签，就只需要新增对应的SqlNode实现就能支持。mybatis使用OGNL表达式语言。对sqlNode的调用在SQL执行期间的DynamicSqlSource.getBoundSql()方法中，SQL执行过程我们后面会讲解。<br>　　当前版本的SqlNode有下列实现：<br>　　其中MixedSqlNode代表了所有具体SqlNode的集合，其他分别代表了一种类型的SqlNode。下面对每个SqlNode的实现做简单的分析：</p>
                                    <h3><b>ChooseSqlNode</b></h3>
                                    <div class="highlight"><pre><code class="language-text">public class ChooseSqlNode implements SqlNode {
  private final SqlNode defaultSqlNode;
  private final List&lt;SqlNode&gt; ifSqlNodes;

  public ChooseSqlNode(List&lt;SqlNode&gt; ifSqlNodes, SqlNode defaultSqlNode) {
    this.ifSqlNodes = ifSqlNodes;
    this.defaultSqlNode = defaultSqlNode;
  }

  @Override
  public boolean apply(DynamicContext context) {
    // 遍历所有when分支节点，只要遇到第一个为true就返回
    for (SqlNode sqlNode : ifSqlNodes) {
      if (sqlNode.apply(context)) {
        return true;
      }
    }
    // 全部when都为false时，走otherwise分支
    if (defaultSqlNode != null) {
      defaultSqlNode.apply(context);
      return true;
    }
    return false;
  }
}</code></pre>
                                    </div>
                                    <h3><b>ForEachSqlNode</b></h3>
                                    <div class="highlight"><pre><code class="language-text">public class ForEachSqlNode implements SqlNode {
  public static final String ITEM_PREFIX = "__frch_";

  private final ExpressionEvaluator evaluator;
  private final String collectionExpression;
  private final SqlNode contents;
  private final String open;
  private final String close;
  private final String separator;
  private final String item;
  private final String index;
  private final Configuration configuration;

  public ForEachSqlNode(Configuration configuration, SqlNode contents, String collectionExpression, String index, String item, String open, String close, String separator) {
    this.evaluator = new ExpressionEvaluator();
    this.collectionExpression = collectionExpression;
    this.contents = contents;
    this.open = open;
    this.close = close;
    this.separator = separator;
    this.index = index;
    this.item = item;
    this.configuration = configuration;
  }

  @Override
  public boolean apply(DynamicContext context) {
    Map&lt;String, Object&gt; bindings = context.getBindings();
    // 将Map/Array/List统一包装为迭代器接口
    final Iterable&lt;?&gt; iterable = evaluator.evaluateIterable(collectionExpression, bindings);
    if (!iterable.iterator().hasNext()) {
      return true;
    }
    boolean first = true;
    applyOpen(context);
    int i = 0;
    // 遍历集合
    for (Object o : iterable) {
      DynamicContext oldContext = context;
      if (first || separator == null) {
        context = new PrefixedContext(context, "");
      } else {
        context = new PrefixedContext(context, separator);
      }
      int uniqueNumber = context.getUniqueNumber();
      // Issue #709 
      if (o instanceof Map.Entry) {  //Map条目处理
        @SuppressWarnings("unchecked") 
        Map.Entry&lt;Object, Object&gt; mapEntry = (Map.Entry&lt;Object, Object&gt;) o;
        applyIndex(context, mapEntry.getKey(), uniqueNumber);
        applyItem(context, mapEntry.getValue(), uniqueNumber);
      } else { // List条目处理
        applyIndex(context, i, uniqueNumber);
        applyItem(context, o, uniqueNumber);
      }
      // 子节点SqlNode处理，很重要的一个逻辑就是将#{item.XXX}转换为#{__frch_item_N.XXX}，这样在JDBC设置参数的时候就能够找到对应的参数值了
      contents.apply(new FilteredDynamicContext(configuration, context, index, item, uniqueNumber));
      if (first) {
        first = !((PrefixedContext) context).isPrefixApplied();
      }
      context = oldContext;
      i++;
    }
    applyClose(context);
    context.getBindings().remove(item);
    context.getBindings().remove(index);
    return true;
  }

  private void applyIndex(DynamicContext context, Object o, int i) {
    if (index != null) {
      context.bind(index, o);
      context.bind(itemizeItem(index, i), o);
    }
  }

  private void applyItem(DynamicContext context, Object o, int i) {
    if (item != null) {
      context.bind(item, o);
      context.bind(itemizeItem(item, i), o);
    }
  }

  private void applyOpen(DynamicContext context) {
    if (open != null) {
      context.appendSql(open);
    }
  }

  private void applyClose(DynamicContext context) {
    if (close != null) {
      context.appendSql(close);
    }
  }

  private static String itemizeItem(String item, int i) {
    return new StringBuilder(ITEM_PREFIX).append(item).append("_").append(i).toString();
  }

  private static class FilteredDynamicContext extends DynamicContext {
    private final DynamicContext delegate;
    private final int index;
    private final String itemIndex;
    private final String item;

    public FilteredDynamicContext(Configuration configuration,DynamicContext delegate, String itemIndex, String item, int i) {
      super(configuration, null);
      this.delegate = delegate;
      this.index = i;
      this.itemIndex = itemIndex;
      this.item = item;
    }

    @Override
    public Map&lt;String, Object&gt; getBindings() {
      return delegate.getBindings();
    }

    @Override
    public void bind(String name, Object value) {
      delegate.bind(name, value);
    }

    @Override
    public String getSql() {
      return delegate.getSql();
    }

    @Override
    public void appendSql(String sql) {
      GenericTokenParser parser = new GenericTokenParser("#{", "}", new TokenHandler() {
        @Override
        // 将#{item.XXX}转换为#{__frch_item_N.XXX}
        public String handleToken(String content) {
          String newContent = content.replaceFirst("^\\s*" + item + "(?![^.,:\\s])", itemizeItem(item, index));
          if (itemIndex != null &amp;&amp; newContent.equals(content)) {
            newContent = content.replaceFirst("^\\s*" + itemIndex + "(?![^.,:\\s])", itemizeItem(itemIndex, index));
          }
          return new StringBuilder("#{").append(newContent).append("}").toString();
        }
      });

      delegate.appendSql(parser.parse(sql));
    }

    @Override
    public int getUniqueNumber() {
      return delegate.getUniqueNumber();
    }

  }


  private class PrefixedContext extends DynamicContext {
    private final DynamicContext delegate;
    private final String prefix;
    private boolean prefixApplied;

    public PrefixedContext(DynamicContext delegate, String prefix) {
      super(configuration, null);
      this.delegate = delegate;
      this.prefix = prefix;
      this.prefixApplied = false;
    }

    public boolean isPrefixApplied() {
      return prefixApplied;
    }

    @Override
    public Map&lt;String, Object&gt; getBindings() {
      return delegate.getBindings();
    }

    @Override
    public void bind(String name, Object value) {
      delegate.bind(name, value);
    }

    @Override
    public void appendSql(String sql) {
      if (!prefixApplied &amp;&amp; sql != null &amp;&amp; sql.trim().length() &gt; 0) {
        delegate.appendSql(prefix);
        prefixApplied = true;
      }
      delegate.appendSql(sql);
    }

    @Override
    public String getSql() {
      return delegate.getSql();
    }

    @Override
    public int getUniqueNumber() {
      return delegate.getUniqueNumber();
    }
  }

}</code></pre>
                                    </div>
                                    <h3><b>IfSqlNode</b></h3>
                                    <div class="highlight"><pre><code class="language-text">public class IfSqlNode implements SqlNode {
  private final ExpressionEvaluator evaluator;  //表达式执行器
  private final String test;    //条件表达式
  private final SqlNode contents;

  public IfSqlNode(SqlNode contents, String test) {
    this.test = test;
    this.contents = contents;
    this.evaluator = new ExpressionEvaluator();
  }

  @Override
  public boolean apply(DynamicContext context) {
    if (evaluator.evaluateBoolean(test, context.getBindings())) {
      contents.apply(context);
      return true;
    }
    return false;
  }
}</code></pre>
                                    </div>
                                    <p data-pid="sVePRprh">ExpressionEvaluator的定义如下：</p>
                                    <div class="highlight"><pre><code class="language-text">public class ExpressionEvaluator {
  // 布尔表达式解析，对于返回值为数字的if表达式,0为假，非0为真
  public boolean evaluateBoolean(String expression, Object parameterObject) {
    Object value = OgnlCache.getValue(expression, parameterObject);
    if (value instanceof Boolean) {
      return (Boolean) value;
    }
    if (value instanceof Number) {
      return new BigDecimal(String.valueOf(value)).compareTo(BigDecimal.ZERO) != 0;
    }
    return value != null;
  }

   // 循环表达式解析，主要用于foreach标签
  public Iterable&lt;?&gt; evaluateIterable(String expression, Object parameterObject) {
    Object value = OgnlCache.getValue(expression, parameterObject);
    if (value == null) {
      throw new BuilderException("The expression '" + expression + "' evaluated to a null value.");
    }
    if (value instanceof Iterable) {
      return (Iterable&lt;?&gt;) value;
    }
    if (value.getClass().isArray()) {
        // the array may be primitive, so Arrays.asList() may throw
        // a ClassCastException (issue 209).  Do the work manually
        // Curse primitives! :) (JGB)
        int size = Array.getLength(value);
        List&lt;Object&gt; answer = new ArrayList&lt;Object&gt;();
        for (int i = 0; i &lt; size; i++) {
            Object o = Array.get(value, i);
            answer.add(o);
        }
        return answer;
    }
    if (value instanceof Map) {
      return ((Map) value).entrySet();
    }
    throw new BuilderException("Error evaluating expression '" + expression + "'.  Return value (" + value + ") was not iterable.");
  }
}</code></pre>
                                    </div>
                                    <h3><b>StaticTextSqlNode</b></h3>
                                    <p data-pid="tzXoVho5">　　静态文本节点不做任何处理，直接将本文本节点的内容追加到已经解析了的SQL文本的后面。</p>
                                    <div class="highlight"><pre><code class="language-text">public class StaticTextSqlNode implements SqlNode {
  private final String text;

  public StaticTextSqlNode(String text) {
    this.text = text;
  }

  @Override
  public boolean apply(DynamicContext context) {
    context.appendSql(text);
    return true;
  }

}</code></pre>
                                    </div>
                                    <h3><b>TextSqlNode</b></h3>
                                    <p data-pid="0KeuJEXR">　　TextSqlNode主要是用来将${}转换为实际的参数值，并返回拼接后的SQL语句，为了防止SQL注入，可以通过标签来创建OGNL上下文变量。</p>
                                    <div class="highlight"><pre><code class="language-text">public class TextSqlNode implements SqlNode {
  private final String text;
  private final Pattern injectionFilter;

  public TextSqlNode(String text) {
    this(text, null);
  }

  public TextSqlNode(String text, Pattern injectionFilter) {
    this.text = text;
    this.injectionFilter = injectionFilter;
  }

  public boolean isDynamic() {
    DynamicCheckerTokenParser checker = new DynamicCheckerTokenParser();
    GenericTokenParser parser = createParser(checker);
    parser.parse(text);
    return checker.isDynamic();
  }

  @Override
  public boolean apply(DynamicContext context) {
    GenericTokenParser parser = createParser(new BindingTokenParser(context, injectionFilter));
    context.appendSql(parser.parse(text));
    return true;
  }

  private GenericTokenParser createParser(TokenHandler handler) {
    return new GenericTokenParser("${", "}", handler);
  }

  private static class BindingTokenParser implements TokenHandler {

    private DynamicContext context;
    private Pattern injectionFilter;

    public BindingTokenParser(DynamicContext context, Pattern injectionFilter) {
      this.context = context;
      this.injectionFilter = injectionFilter;
    }
    // 将${}中的值替换为查询参数中实际的值并返回，在StaticTextSqlNode中，#{}返回的是?
    @Override
    public String handleToken(String content) {
      Object parameter = context.getBindings().get("_parameter");
      if (parameter == null) {
        context.getBindings().put("value", null);
      } else if (SimpleTypeRegistry.isSimpleType(parameter.getClass())) {
        context.getBindings().put("value", parameter);
      }
      Object value = OgnlCache.getValue(content, context.getBindings());
      String srtValue = (value == null ? "" : String.valueOf(value)); // issue #274 return "" instead of "null"
      checkInjection(srtValue);
      return srtValue;
    }

    private void checkInjection(String value) {
      if (injectionFilter != null &amp;&amp; !injectionFilter.matcher(value).matches()) {
        throw new ScriptingException("Invalid input. Please conform to regex" + injectionFilter.pattern());
      }
    }
  }

  private static class DynamicCheckerTokenParser implements TokenHandler {

    private boolean isDynamic;

    public DynamicCheckerTokenParser() {
      // Prevent Synthetic Access
    }

    public boolean isDynamic() {
      return isDynamic;
    }

    @Override
    public String handleToken(String content) {
      this.isDynamic = true;
      return null;
    }
  }

}</code></pre>
                                    </div>
                                    <h3><b>VarDeclSqlNode</b></h3>
                                    <div class="highlight"><pre><code class="language-text">public class VarDeclSqlNode implements SqlNode {

  private final String name;
  private final String expression;

  public VarDeclSqlNode(String var, String exp) {
    name = var;
    expression = exp;
  }

  @Override
  public boolean apply(DynamicContext context) {
    final Object value = OgnlCache.getValue(expression, context.getBindings());
    // 直接将ognl表达式加到当前映射语句的上下文中，这样就可以直接获取到了
    context.bind(name, value);
    return true;
  }

}</code></pre>
                                    </div>
                                    <p data-pid="6xfaAH19">　　DynamicContext.bind方法的实现如下：</p>
                                    <div class="highlight"><pre><code class="language-text">private final ContextMap bindings;
  public void bind(String name, Object value) {
    bindings.put(name, value);
  }</code></pre>
                                    </div>
                                    <h3><b>TrimSqlNode</b></h3>
                                    <div class="highlight"><pre><code class="language-text">public class TrimSqlNode implements SqlNode {

  private final SqlNode contents;
  private final String prefix;
  private final String suffix;
  private final List&lt;String&gt; prefixesToOverride;  // 要trim多个文本的话,|分隔即可
  private final List&lt;String&gt; suffixesToOverride;  // 要trim多个文本的话,|分隔即可
  private final Configuration configuration;

  public TrimSqlNode(Configuration configuration, SqlNode contents, String prefix, String prefixesToOverride, String suffix, String suffixesToOverride) {
    this(configuration, contents, prefix, parseOverrides(prefixesToOverride), suffix, parseOverrides(suffixesToOverride));
  }

  protected TrimSqlNode(Configuration configuration, SqlNode contents, String prefix, List&lt;String&gt; prefixesToOverride, String suffix, List&lt;String&gt; suffixesToOverride) {
    this.contents = contents;
    this.prefix = prefix;
    this.prefixesToOverride = prefixesToOverride;
    this.suffix = suffix;
    this.suffixesToOverride = suffixesToOverride;
    this.configuration = configuration;
  }

  @Override
  public boolean apply(DynamicContext context) {
    FilteredDynamicContext filteredDynamicContext = new FilteredDynamicContext(context);
    // trim节点只有在至少有一个子节点不为空的时候才有意义
    boolean result = contents.apply(filteredDynamicContext);
    // 所有子节点处理完成之后,filteredDynamicContext.delegate里面就包含解析后的静态SQL文本了，此时就可以处理前后的trim了
    filteredDynamicContext.applyAll();
    return result;
  }

  private static List&lt;String&gt; parseOverrides(String overrides) {
    if (overrides != null) {
      final StringTokenizer parser = new StringTokenizer(overrides, "|", false);
      final List&lt;String&gt; list = new ArrayList&lt;String&gt;(parser.countTokens());
      while (parser.hasMoreTokens()) {
        list.add(parser.nextToken().toUpperCase(Locale.ENGLISH));
      }
      return list;
    }
    return Collections.emptyList();
  }

  private class FilteredDynamicContext extends DynamicContext {
    private DynamicContext delegate;
    private boolean prefixApplied;
    private boolean suffixApplied;
    private StringBuilder sqlBuffer;

    public FilteredDynamicContext(DynamicContext delegate) {
      super(configuration, null);
      this.delegate = delegate;
      this.prefixApplied = false;
      this.suffixApplied = false;
      this.sqlBuffer = new StringBuilder();
    }

    public void applyAll() {
      sqlBuffer = new StringBuilder(sqlBuffer.toString().trim());
      String trimmedUppercaseSql = sqlBuffer.toString().toUpperCase(Locale.ENGLISH);
      if (trimmedUppercaseSql.length() &gt; 0) {
        applyPrefix(sqlBuffer, trimmedUppercaseSql);
        applySuffix(sqlBuffer, trimmedUppercaseSql);
      }
      delegate.appendSql(sqlBuffer.toString());
    }

    @Override
    public Map&lt;String, Object&gt; getBindings() {
      return delegate.getBindings();
    }

    @Override
    public void bind(String name, Object value) {
      delegate.bind(name, value);
    }

    @Override
    public int getUniqueNumber() {
      return delegate.getUniqueNumber();
    }

    @Override
    public void appendSql(String sql) {
      sqlBuffer.append(sql);
    }

    @Override
    public String getSql() {
      return delegate.getSql();
    }
    // 处理前缀
    private void applyPrefix(StringBuilder sql, String trimmedUppercaseSql) {
      if (!prefixApplied) {
        prefixApplied = true;
        if (prefixesToOverride != null) {
          for (String toRemove : prefixesToOverride) {
            if (trimmedUppercaseSql.startsWith(toRemove)) {
              sql.delete(0, toRemove.trim().length());
              break;
            }
          }
        }
        if (prefix != null) {
          sql.insert(0, " ");
          sql.insert(0, prefix);
        }
      }
    }

    // 处理后缀
    private void applySuffix(StringBuilder sql, String trimmedUppercaseSql) {
      if (!suffixApplied) {
        suffixApplied = true;
        if (suffixesToOverride != null) {
          for (String toRemove : suffixesToOverride) {
            if (trimmedUppercaseSql.endsWith(toRemove) || trimmedUppercaseSql.endsWith(toRemove.trim())) {
              int start = sql.length() - toRemove.trim().length();
              int end = sql.length();
              sql.delete(start, end);
              break;
            }
          }
        }
        if (suffix != null) {
          sql.append(" ");
          sql.append(suffix);
        }
      }
    }
  }
}</code></pre>
                                    </div>
                                    <h3><b>SetSqlNode</b></h3>
                                    <p data-pid="v_n1AKRo">　　SetSqlNode直接委托给TrimSqlNode处理。参见TrimSqlNode。</p>
                                    <h3><b>WhereSqlNode</b></h3>
                                    <p data-pid="M5ervmQt">　　WhereSqlNode直接委托给TrimSqlNode处理。参见TrimSqlNode。</p>
                                    <h3><b>3.3 BaseBuilder</b></h3>
                                    <p data-pid="WlKUJ3d7">　　从整个设计角度来说，BaseBuilder的目的是为了统一解析的使用，但在实现上却出入较大。首先，BaseBuilder是所有解析类的MapperBuilderAssistant、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder等的父类。如下所示：<br></p>
                                    <figure data-size="normal">
                                        <noscript><img class="content_image" data-caption="" data-size="normal" src="https://pic2.zhimg.com/v2-3c40829a650f96ab57be6975d78f8601_b.jpg"/></noscript>
                                        <div><img class="content_image lazy" data-actualsrc="https://pic2.zhimg.com/v2-3c40829a650f96ab57be6975d78f8601_b.jpg" data-caption="" data-original-token="v2-3c40829a650f96ab57be6975d78f8601" data-size="normal" src="data:image/svg+xml;utf8,&lt;svg xmlns=&#39;http://www.w3.org/2000/svg&#39; width=&#39;0&#39; height=&#39;0&#39;&gt;&lt;/svg&gt;"></div>
                                    </figure>
                                    <p data-pid="ans0KMlz"><br>　　BaseBuilder中提供类型处理器、JDBC类型、结果集类型、别名等的解析，因为在mybatis配置文件、mapper文件解析、SQL映射语句解析、基于注解的mapper文件解析过程中，都会频繁的遇到类型处理相关的解析。但是BaseBuilder也没有定义需要子类实现的负责解析的抽象接口，虽然XMLMapperBuilder、XMLConfigBuilder的解析入口是parse方法，XMLStatementBuilder的入口是parseStatementNode，不仅如此，MapperBuilderAssistant继承了BaseBuilder，而不是MapperAnnotationBuilder，实际上MapperAnnotationBuilder才是解析Mapper接口的主控类。</p>
                                    <p data-pid="g-cOC5_S">　　所以从实现上来说，BaseBuilder如果要作为具体Builder类的抽象父类，那就应该定义一个需要子类实现的parse接口，要么就用组合代替继承。</p>
                                    <h3><b>3.4 AdditionalParameter</b></h3>
                                    <p data-pid="jneqv7_D">　　额外参数主要是维护一些在加载时无法确定的参数，比如标签中的参数在加载时就无法尽最大努力确定，必须通过运行时执行org.apache.ibatis.scripting.xmltags.DynamicSqlSource.getBoundSql()中的SqlNode.apply()才能确定真正要执行的SQL语句，以及额外参数。比如，对于下列的foreach语句，它的AdditionalParameter内容为：<br>{<b>frch_index_0=0, item=2,</b> frch_index_1=1, _parameter=org.mybatis.internal.example.pojo.UserReq@5ccddd20, index=1, <b>frch_item_1=2, _databaseId=null,</b> frch_item_0=1}<br>　　其中_parameter和_databaseId在DynamicContext构造器中硬编码，其他值通过调用ForEachSqlNode.apply()计算得到。与此相对应，此时SQL语句在应用ForeachSqlNode之后，对参数名也进行重写，如下所示：</p>
                                    <blockquote data-pid="wiEnkHiu">select lfPartyId,author as authors,subject,comments,title,partyName from LfParty where partyName = #{partyName} AND partyName like #{partyName} and lfPartyId in ( #{__frch_item_0.prop} , #{__frch_item_1} )</blockquote>
                                    <p data-pid="_CRfSFbE">　　然后通过SqlSourceBuilder.parse()调用ParameterMappingTokenHandler计算出该sql的ParameterMapping列表，最后构造出StaticSqlSource。</p>
                                    <h3><b>3.5 TypeHandler</b></h3>
                                    <p data-pid="QcvTIdVO">　　当MyBatis将一个Java对象作为输入/输出参数执行CRUD语句操作时，它会创建一个PreparedStatement对象，并且调用setXXX()为占位符设置相应的参数值。XXX可以是Int，String，Date等Java内置类型，或者用户自定义的类型。在实现上，MyBatis是通过使用类型处理器（type handler）来确定XXX是具体什么类型的。MyBatis对于下列类型使用内建的类型处理器：所有的基本数据类型、基本类型的包裹类型、byte[] 、java.util.Date、java.sql.Date、java,sql.Time、java.sql.Timestamp、java 枚举类型等。对于用户自定义的类型，我们可以创建一个自定义的类型处理器。要创建自定义类型处理器，只要实现TypeHandler接口即可，TypeHandler接口的定义如下：</p>
                                    <div class="highlight"><pre><code class="language-text">public interface TypeHandler&lt;T&gt; {

  void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException;

  T getResult(ResultSet rs, String columnName) throws SQLException;

  T getResult(ResultSet rs, int columnIndex) throws SQLException;

  T getResult(CallableStatement cs, int columnIndex) throws SQLException;

}</code></pre>
                                    </div>
                                    <p data-pid="fvRsUR1n">　　虽然我们可以直接实现TypeHandler接口，但是在实践中，我们一般选择继承BaseTypeHandler，BaseTypeHandler为TypeHandler提供了部分骨架代码，使得用户使用方便，几乎所有mybatis内置类型处理器都继承于BaseTypeHandler。下面我们实现一个最简单的自定义类型处理器MobileTypeHandler。</p>
                                    <div class="highlight"><pre><code class="language-text">public class MobileTypeHandler extends BaseTypeHandler&lt;Mobile&gt; {

    @Override  
    public Mobile getNullableResult(ResultSet rs, String columnName)  
            throws SQLException {  
        // mobile字段是VARCHAR类型，所以使用rs.getString
        return new Mobile(rs.getString(columnName));  
    }  

    @Override  
    public Mobile getNullableResult(ResultSet rs, int columnIndex)  
            throws SQLException {  
        return new Mobile(rs.getString(columnIndex));  
    }  

    @Override  
    public Mobile getNullableResult(CallableStatement cs, int columnIndex)  
            throws SQLException {  
        return new Mobile(cs.getString(columnIndex));  
    }  

    @Override  
    public void setNonNullParameter(PreparedStatement ps, int i,  
            Mobile param, JdbcType jdbcType) throws SQLException {  
        ps.setString(i, param.getFullNumber());  
    }  
}</code></pre>
                                    </div>
                                    <p data-pid="k_LTauKq">　　我们实现了自定义的类型处理器后，只要在mybatis配置文件mybatis-config.xml中注册就可以使用了，如下：</p>
                                    <div class="highlight"><pre><code class="language-text">&lt;typeHandlers&gt;
    &lt;typeHandler handler="org.mybatis.internal.example.MobileTypeHandler" /&gt;  
&lt;/typeHandlers&gt;</code></pre>
                                    </div>
                                    <p data-pid="umF6Hlyb">　　上述完成之后，当我们在parameterType或者resultType或者resultMap中遇到Mobile类型的属性时，就会调用MobileTypeHandler进行代理出入参的设置和获取。</p>
                                    <h3><b>3.6 对象包装器工厂ObjectWrapperFactory</b></h3>
                                    <p data-pid="tuJ7Di6k">　　ObjectWrapperFactory是一个对象包装器工厂,用于对返回的结果对象进行二次处理,它主要在org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getRowValue方法中创建对象的MetaObject时作为参数设置进去,这样MetaObject中的objectWrapper属性就可以被设置为我们自定义的ObjectWrapper实现而不是mybatis内置实现,如下所示：</p>
                                    <div class="highlight"><pre><code class="language-text">private MetaObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) {
    this.originalObject = object;
    this.objectFactory = objectFactory;
    this.objectWrapperFactory = objectWrapperFactory;
    this.reflectorFactory = reflectorFactory;

    if (object instanceof ObjectWrapper) {
      this.objectWrapper = (ObjectWrapper) object;
    } else if (objectWrapperFactory.hasWrapperFor(object)) { // 如果有自定义的ObjectWrapperFactory,就不会总是返回false了,这样对于特定类就启用了的我们自定义的ObjectWrapper
      this.objectWrapper = objectWrapperFactory.getWrapperFor(this, object);
    } else if (object instanceof Map) {
      this.objectWrapper = new MapWrapper(this, (Map) object);
    } else if (object instanceof Collection) {
      this.objectWrapper = new CollectionWrapper(this, (Collection) object);
    } else {
      this.objectWrapper = new BeanWrapper(this, object);
    }
  }</code></pre>
                                    </div>
                                    <p data-pid="bUQiBDHO">　　典型的下划线转驼峰,我们就可以使用ObjectWrapperFactory来统一处理(当然,在实际中,我们一般不会这么做,而是通过设置mapUnderscoreToCamelCase来实现)。ObjectWrapperFactory 接口如下：</p>
                                    <div class="highlight"><pre><code class="language-text">public interface ObjectWrapperFactory {

  boolean hasWrapperFor(Object object);

  ObjectWrapper getWrapperFor(MetaObject metaObject, Object object);

}</code></pre>
                                    </div>
                                    <p data-pid="TYEKMq_I">　　通过实现这个接口，可以判断当object是特定类型时，返回true，然后在下面的getWrapperFor中返回一个可以处理key为驼峰的ObjectWrapper 实现类即可。ObjectWrapper类可以说是对象反射信息的facade模式，它的定义如下：</p>
                                    <div class="highlight"><pre><code class="language-text">public interface ObjectWrapper {

  Object get(PropertyTokenizer prop);

  void set(PropertyTokenizer prop, Object value);

  String findProperty(String name, boolean useCamelCaseMapping);

  String[] getGetterNames();

  String[] getSetterNames();

  Class&lt;?&gt; getSetterType(String name);

  Class&lt;?&gt; getGetterType(String name);

  boolean hasSetter(String name);

  boolean hasGetter(String name);

  MetaObject instantiatePropertyValue(String name, PropertyTokenizer prop, ObjectFactory objectFactory);

  boolean isCollection();

  void add(Object element);

  &lt;E&gt; void addAll(List&lt;E&gt; element);

}</code></pre>
                                    </div>
                                    <p data-pid="4cbgfu0_">　　当然，我们不需要从头实现ObjectWrapper接口,可以选择继承BeanWrapper或者MapWrapper。比如对于Map类型，我们可以继承MapWrapper，让参数useCamelCaseMapping起作用。MapWrapper默认的findProperty方法并没有做驼峰转换处理，如下：：</p>
                                    <div class="highlight"><pre><code class="language-text">@Override
  public String findProperty(String name, boolean useCamelCaseMapping) {
    return name;
  }</code></pre>
                                    </div>
                                    <p data-pid="SO-EH84Z">　　我们可以改成：</p>
                                    <div class="highlight"><pre><code class="language-text">public class CamelMapWrapper extends MapWrapper {
    public CamelMapWrapper(MetaObject metaObject, Map&lt;String, Object&gt; map) {
        super(metaObject, map);
    }

    @Override
    public String findProperty(String name, boolean useCamelCaseMapping) {
        if (useCamelCaseMapping
                &amp;&amp; ((name.charAt(0) &gt;= 'A' &amp;&amp; name.charAt(0) &lt;= 'Z')
                     || name.indexOf("_") &gt;= 0)) {
            return underlineToCamelhump(name);
        }
        return name;
    }

    /**
     * 将下划线风格替换为驼峰风格
     */
    public String underlineToCamelhump(String inputString) {
        StringBuilder sb = new StringBuilder();

        boolean nextUpperCase = false;
        for (int i = 0; i &lt; inputString.length(); i++) {
            char c = inputString.charAt(i);
            if (c == '_') {
                if (sb.length() &gt; 0) {
                    nextUpperCase = true;
                }
            } else {
                if (nextUpperCase) {
                    sb.append(Character.toUpperCase(c));
                    nextUpperCase = false;
                } else {
                    sb.append(Character.toLowerCase(c));
                }
            }
        }
        return sb.toString();
    }
}</code></pre>
                                    </div>
                                    <p data-pid="yxYWv-Rs">　　同时，创建一个自定义的objectWrapperFactory如下：</p>
                                    <div class="highlight"><pre><code class="language-text">public class CustomWrapperFactory implements ObjectWrapperFactory {

    @Override
    public boolean hasWrapperFor(Object object) {
        return object != null &amp;&amp; object instanceof Map;
    }

    @Override
    public ObjectWrapper getWrapperFor(MetaObject metaObject, Object object) {
        return new CamelMapWrapper(metaObject, (Map) object);
    }

}</code></pre>
                                    </div>
                                    <p data-pid="4_f8zxX6">　　然后，在 MyBatis 配置文件中配置上objectWrapperFactory：</p>
                                    <div class="highlight">
                                        <pre><code class="language-text">&lt;objectWrapperFactory type="org.mybatis.internal.example.CustomWrapperFactory"/&gt;</code></pre>
                                    </div>
                                    <p data-pid="42MSu_YI">　　同样，useCamelCaseMapping最终是通过mapUnderscoreToCamelCase设置注入进来的，所以settings要加上这个设置：</p>
                                    <div class="highlight">
                                        <pre><code class="language-text">&lt;setting name="mapUnderscoreToCamelCase" value="true"/&gt;</code></pre>
                                    </div>
                                    <p data-pid="dBTGkWzN">　　此时，如果resultType是map类型的话,就可以看到key已经是驼峰式而不是columnName了。<br>　　注意：mybatis提供了一个什么都不做的默认实现DefaultObjectWrapperFactory。</p>
                                    <h3><b>3.7 MetaObject</b></h3>
                                    <p data-pid="a9MWBMmh">　　MetaObject是一个对象包装器，其性质上有点类似ASF提供的commons类库，其中包装了对象的元数据信息，对象本身，对象反射工厂，对象包装器工厂等。使得根据OGNL表达式设置或者获取对象的属性更为便利，也可以更加方便的判断对象中是否包含指定属性、指定属性是否具有getter、setter等。主要的功能是通过其ObjectWrapper类型的属性完成的，它包装了操作对象元数据以及对象本身的主要接口，操作标准对象的实现是BeanWrapper。BeanWrapper类型有个MetaClass类型的属性，MetaClass中有个Reflector属性，其中包含了可读、可写的属性、方法以及构造器信息。</p>
                                    <h3><b>3.8 对象工厂ObjectFactory</b></h3>
                                    <p data-pid="ic3I3gu4">　　MyBatis 每次创建结果对象的新实例时，都会使用一个对象工厂（ObjectFactory）实例来完成。 默认的对象工厂DefaultObjectFactory仅仅是实例化目标类，要么通过默认构造方法，要么在参数映射存在的时候通过参数构造方法来实例化。如果想覆盖对象工厂的默认行为比如给某些属性设置默认值(有些时候直接修改对象不可行，或者由于不是自己拥有的代码或者改动太大)，则可以通过创建自己的对象工厂来实现。ObjectFactory接口定义如下：</p>
                                    <div class="highlight"><pre><code class="language-text">public interface ObjectFactory {

  /**
   * Sets configuration properties.
   * @param properties configuration properties
   */
  void setProperties(Properties properties);

  /**
   * Creates a new object with default constructor. 
   * @param type Object type
   * @return
   */
  &lt;T&gt; T create(Class&lt;T&gt; type);

  /**
   * Creates a new object with the specified constructor and params.
   * @param type Object type
   * @param constructorArgTypes Constructor argument types
   * @param constructorArgs Constructor argument values
   * @return
   */
  &lt;T&gt; T create(Class&lt;T&gt; type, List&lt;Class&lt;?&gt;&gt; constructorArgTypes, List&lt;Object&gt; constructorArgs);

  /**
   * Returns true if this object can have a set of other objects.
   * It's main purpose is to support non-java.util.Collection objects like Scala collections.
   * 
   * @param type Object type
   * @return whether it is a collection or not
   * @since 3.1.0
   */
  &lt;T&gt; boolean isCollection(Class&lt;T&gt; type);

}</code></pre>
                                    </div>
                                    <p data-pid="2CwfwG8I">　　从这个接口定义可以看出，它包含了两种通过反射机制构造实体类对象的方法，一种是通过无参构造函数，一种是通过带参数的构造函数。同时，为了使工厂类能设置其他属性，还提供了setProperties()方法。<br>　　要自定义对象工厂类，我们可以实现ObjectFactory这个接口，但是这样我们就需要自己去实现一些在DefaultObjectFactory已经实现好了的东西，所以也可以继承这个DefaultObjectFactory类，这样可以使得实现起来更为简单。例如，我们希望给Order对象的属性hostname设置为本地机器名，可以像下面这么实现：</p>
                                    <div class="highlight"><pre><code class="language-text">public class CustomObjectFactory extends DefaultObjectFactory{
  private static String hostname;
  static {
      InetAddress addr = InetAddress.getLocalHost();  
      String ip=addr.getHostAddress().toString(); //获取本机ip  
      hostName=addr.getHostName().toString(); //获取本机计算机名称  
  }
    private static final long serialVersionUID = 1128715667301891724L;  

    @Override  
    public &lt;T&gt; T create(Class&lt;T&gt; type) {  
        T result = super.create(type);  
        if(type.equals(Order.class)){  
            ((Order)result).setIp(hostname);  
        }  
        return result;  
    }  
}</code></pre>
                                    </div>
                                    <p data-pid="1ruo6jbt">　　接下来，在配置文件中配置对象工厂类为我们创建的对象工厂类CustomObjectFactory。</p>
                                    <div class="highlight">
                                        <pre><code class="language-text">&lt;objectFactory type="org.mybatis.internal.example.CustomObjectFactory"&gt;&lt;/objectFactory&gt;</code></pre>
                                    </div>
                                    <p data-pid="2_Nmcz7K">　　此时执行代码，就会发现返回的Order对象中ip字段的值为本机名。</p>
                                    <p data-pid="O-mhwK-P">3.9 MappedStatement<br>　　mapper文件或者mapper接口中每个映射语句都对应一个MappedStatement实例，它包含了所有运行时需要的信息比如结果映射、参数映射、是否需要刷新缓存等。MappedStatement定义如下：<br>public final class MappedStatement {</p>
                                    <p data-pid="idCreToC">private String resource;<br>private Configuration configuration;<br>private String id;<br>private Integer fetchSize;<br>private Integer timeout;<br>private StatementType statementType;<br>private ResultSetType resultSetType;<br>private SqlSource sqlSource;<br>private Cache cache;<br>private ParameterMap parameterMap;<br>private List resultMaps;<br>private boolean flushCacheRequired;<br>private boolean useCache;<br>private boolean resultOrdered;<br>private SqlCommandType sqlCommandType;<br>private KeyGenerator keyGenerator;<br>private String[] keyProperties;<br>private String[] keyColumns;<br>private boolean hasNestedResultMaps;<br>private String databaseId;<br>private Log statementLog;<br>private LanguageDriver lang;<br>private String[] resultSets;<br>…</p>
                                    <p data-pid="3lxTnPzt">public MappedStatement build() {<br>assert mappedStatement.configuration != null;<br>assert mappedStatement.id != null;<br>assert mappedStatement.sqlSource != null;<br>assert mappedStatement.lang != null;<br>mappedStatement.resultMaps = Collections.unmodifiableList(mappedStatement.resultMaps);<br>return mappedStatement;<br>}<br>}<br>…<br>}<br>　　唯一值得注意的是resultMaps被设计为只读,这样应用可以查看但是不能修改。</p>
                                    <p data-pid="SZ579yCY">3.10 ParameterMapping<br>　　每个参数映射&lt;&gt;标签都被创建为一个ParameterMapping实例，其中包含和结果映射类似的信息，如下：<br>public class ParameterMapping {</p>
                                    <p data-pid="vwhkbnCw">private Configuration configuration;</p>
                                    <p data-pid="4pvZkB74">private String property;<br>private ParameterMode mode;<br>private Class&lt;?&gt; javaType = Object.class;<br>private JdbcType jdbcType;<br>private Integer numericScale;<br>private TypeHandler&lt;?&gt; typeHandler;<br>private String resultMapId;<br>private String jdbcTypeName;<br>private String expression;</p>
                                    <p data-pid="HUH6ikJR">private ParameterMapping() {<br>}<br>…<br>}</p>
                                    <p data-pid="VIvFNQo9">3.11 KeyGenerator</p>
                                    <div class="highlight"><pre><code class="language-text">package org.apache.ibatis.executor.keygen;
public interface KeyGenerator {
  // before key generator 主要用于oracle等使用序列机制的ID生成方式
  void processBefore(Executor executor, MappedStatement ms, Statement stmt, Object parameter);
  // after key generator 主要用于mysql等使用自增机制的ID生成方式
  void processAfter(Executor executor, MappedStatement ms, Statement stmt, Object parameter);

}</code></pre>
                                    </div>
                                    <p data-pid="MGk6a9Y9">3.12 各种Registry<br>　　mybatis将类型处理器，类型别名，mapper定义，语言驱动器等各种信息包装在Registry中维护，如下所示：</p>
                                    <div class="highlight"><pre><code class="language-text">public class Configuration {
  ...
  protected final MapperRegistry mapperRegistry = new MapperRegistry(this);
  protected final InterceptorChain interceptorChain = new InterceptorChain();
  protected final TypeHandlerRegistry typeHandlerRegistry = new TypeHandlerRegistry();
  protected final TypeAliasRegistry typeAliasRegistry = new TypeAliasRegistry();
  protected final LanguageDriverRegistry languageRegistry = new LanguageDriverRegistry();
  ...
}</code></pre>
                                    </div>
                                    <p data-pid="DDgp-2hK">　　各Registry中提供了相关的方法，比如TypeHandlerRegistry中包含了判断某个java类型是否有类型处理器以及获取类型处理器的方法，如下：</p>
                                    <div class="highlight"><pre><code class="language-text">public boolean hasTypeHandler(TypeReference&lt;?&gt; javaTypeReference, JdbcType jdbcType) {
    return javaTypeReference != null &amp;&amp; getTypeHandler(javaTypeReference, jdbcType) != null;
  }

  public &lt;T&gt; TypeHandler&lt;T&gt; getTypeHandler(Class&lt;T&gt; type) {
    return getTypeHandler((Type) type, null);
  }</code></pre>
                                    </div>
                                    <h3><b>3.13 LanguageDriver</b></h3>
                                    <p data-pid="FZ6nQmgu">　　从3.2版本开始，mybatis提供了LanguageDriver接口，我们可以使用该接口自定义SQL的解析方式。先来看下LanguageDriver接口中的3个方法：</p>
                                    <div class="highlight"><pre><code class="language-text">public interface LanguageDriver {

  /**
   * Creates a {@link ParameterHandler} that passes the actual parameters to the the JDBC statement.
   * 创建一个ParameterHandler对象，用于将实际参数赋值到JDBC语句中
   * 
   * @param mappedStatement The mapped statement that is being executed
   * @param parameterObject The input parameter object (can be null) 
   * @param boundSql The resulting SQL once the dynamic language has been executed.
   * @return
   * @author Frank D. Martinez [mnesarco]
   * @see DefaultParameterHandler
   */
  ParameterHandler createParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql);

  /**
   * Creates an {@link SqlSource} that will hold the statement read from a mapper xml file. 
   * It is called during startup, when the mapped statement is read from a class or an xml file.
   * 将XML中读入的语句解析并返回一个sqlSource对象
   * 
   * @param configuration The MyBatis configuration
   * @param script XNode parsed from a XML file
   * @param parameterType input parameter type got from a mapper method or specified in the parameterType xml attribute. Can be null.
   * @return
   */
  SqlSource createSqlSource(Configuration configuration, XNode script, Class&lt;?&gt; parameterType);

  /**
   * Creates an {@link SqlSource} that will hold the statement read from an annotation.
   * It is called during startup, when the mapped statement is read from a class or an xml file.
   * 将注解中读入的语句解析并返回一个sqlSource对象
   * 
   * @param configuration The MyBatis configuration
   * @param script The content of the annotation
   * @param parameterType input parameter type got from a mapper method or specified in the parameterType xml attribute. Can be null.
   * @return 
   */
  SqlSource createSqlSource(Configuration configuration, String script, Class&lt;?&gt; parameterType);

}</code></pre>
                                    </div>
                                    <p data-pid="JSZGh-7d">　　实现了LanguageDriver之后，可以在配置文件中指定该实现类作为SQL的解析器，在XML中我们可以使用 lang 属性来进行指定，如下：</p>
                                    <div class="highlight"><pre><code class="language-text">&lt;typeAliases&gt;
  &lt;typeAlias type="org.sample.MyLanguageDriver" alias="myLanguage"/&gt;
&lt;/typeAliases&gt;

&lt;select id="selectBlog" lang="myLanguage"&gt;
  SELECT * FROM BLOG
&lt;/select&gt;</code></pre>
                                    </div>
                                    <p data-pid="rsAUj39F">　　除了可以在语句级别指定外，也可以全局设置，如下：</p>
                                    <div class="highlight"><pre><code class="language-text">&lt;settings&gt;
  &lt;setting name="defaultScriptingLanguage" value="myLanguage"/&gt;
&lt;/settings&gt;</code></pre>
                                    </div>
                                    <p data-pid="4dZ_jHCz">　　对于mapper接口，也可以使用@Lang注解，如下所示：</p>
                                    <div class="highlight"><pre><code class="language-text">public interface Mapper {
  @Lang(MyLanguageDriver.class) 
  @Select("SELECT * FROM users")
  List&lt;User&gt; selectUser();
}</code></pre>
                                    </div>
                                    <p data-pid="0m6CA9yp">　　LanguageDriver的默认实现类为XMLLanguageDriver。Mybatis默认是XML语言，所以我们来看看XMLLanguageDriver的实现：</p>
                                    <div class="highlight"><pre><code class="language-text">public class XMLLanguageDriver implements LanguageDriver {
  // 创建参数处理器，返回默认的实现
  @Override
  public ParameterHandler createParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql) {
    return new DefaultParameterHandler(mappedStatement, parameterObject, boundSql);
  }

  // 根据XML定义创建SqlSource
  @Override
  public SqlSource createSqlSource(Configuration configuration, XNode script, Class&lt;?&gt; parameterType) {
    XMLScriptBuilder builder = new XMLScriptBuilder(configuration, script, parameterType);
    return builder.parseScriptNode();
  }

  // 解析注解中的SQL语句
  @Override
  public SqlSource createSqlSource(Configuration configuration, String script, Class&lt;?&gt; parameterType) {
    // issue #3
    if (script.startsWith("&lt;script&gt;")) {
      XPathParser parser = new XPathParser(script, false, configuration.getVariables(), new XMLMapperEntityResolver());
      return createSqlSource(configuration, parser.evalNode("/script"), parameterType);
    } else {
      // issue #127
      script = PropertyParser.parse(script, configuration.getVariables());
      TextSqlNode textSqlNode = new TextSqlNode(script);
      if (textSqlNode.isDynamic()) {
        return new DynamicSqlSource(configuration, textSqlNode);
      } else {
        return new RawSqlSource(configuration, script, parameterType);
      }
    }
  }

}</code></pre>
                                    </div>
                                    <p data-pid="8lEgd_uB">　　如上所示，LanguageDriver将实际的实现根据采用的底层不同，委托给了具体的Builder，对于XML配置，委托给XMLScriptBuilder。对于使用Velocity模板的解析器，委托给SQLScriptSource解析具体的SQL。<br>　　注：mybatis-velocity还提供了VelocityLanguageDriver和FreeMarkerLanguageDriver，可参见：</p>
                                    <ul>
                                        <li data-pid="rV7wYIju"><a class=" external" href="https://link.zhihu.com/?target=https%3A//github.com/mybatis/velocity-scripting" rel="nofollow noreferrer" target="_blank"><span class="invisible">https://</span><span class="visible">github.com/mybatis/velo</span><span class="invisible">city-scripting</span><span class="ellipsis"></span></a></li>
                                        <li data-pid="xSYRztAV"><a class=" external" href="https://link.zhihu.com/?target=https%3A//github.com/mybatis/freemarker-scripting" rel="nofollow noreferrer" target="_blank"><span class="invisible">https://</span><span class="visible">github.com/mybatis/free</span><span class="invisible">marker-scripting</span><span class="ellipsis"></span></a></li>
                                    </ul>
                                    <h3><b>3.14 ResultMap</b></h3>
                                    <p data-pid="CQdQqUxQ">　　ResultMap类维护了每个标签中的详细信息，比如id映射、构造器映射、属性映射以及完整的映射列表、是否有嵌套的resultMap、是否有鉴别器、是否有嵌套查询，如下所示：</p>
                                    <div class="highlight"><pre><code class="language-text">public class ResultMap {
  private Configuration configuration;

  private String id;
  private Class&lt;?&gt; type;
  private List&lt;ResultMapping&gt; resultMappings;
  private List&lt;ResultMapping&gt; idResultMappings;
  private List&lt;ResultMapping&gt; constructorResultMappings;
  private List&lt;ResultMapping&gt; propertyResultMappings;
  private Set&lt;String&gt; mappedColumns;
  private Set&lt;String&gt; mappedProperties;
  private Discriminator discriminator;
  private boolean hasNestedResultMaps;
  private boolean hasNestedQueries;
  private Boolean autoMapping;
  ...
}</code></pre>
                                    </div>
                                    <p data-pid="APLpgtxz">　　ResultMap除了作为一个ResultMap的数据结构表示外，本身并没有提供额外的功能。</p>
                                    <h3><b>3.15 ResultMapping</b></h3>
                                    <p data-pid="zFjdcx9i">　　ResultMapping代表下的映射，如下：</p>
                                    <div class="highlight"><pre><code class="language-text">public class ResultMapping {

  private Configuration configuration;
  private String property;
  private String column;
  private Class&lt;?&gt; javaType;
  private JdbcType jdbcType;
  private TypeHandler&lt;?&gt; typeHandler;
  private String nestedResultMapId;
  private String nestedQueryId;
  private Set&lt;String&gt; notNullColumns;
  private String columnPrefix;
  // 标记是否构造器属性，是否ID属性
  private List&lt;ResultFlag&gt; flags;
  private List&lt;ResultMapping&gt; composites;
  private String resultSet;
  private String foreignColumn;
  private boolean lazy;
  ...
}</code></pre>
                                    </div>
                                    <h3><b>3.16 Discriminator</b></h3>
                                    <p data-pid="kbquVeeg">　　每个鉴别器节点都表示为一个Discriminator，如下所示：</p>
                                    <div class="highlight"><pre><code class="language-text">public class Discriminator {
  // 所属的属性节点&lt;result&gt;
  private ResultMapping resultMapping;
  // 内部的if then映射
  private Map&lt;String, String&gt; discriminatorMap;
  ...
}</code></pre>
                                    </div>
                                    <p data-pid="1NU9Jmfd">3.17 Configuration<br>　　Configuration是mybatis所有配置以及mapper文件的元数据容器。无论是解析mapper文件还是运行时执行SQL语句，都需要依赖与mybatis的环境和配置信息，比如databaseId、类型别名等。mybatis实现将所有这些信息封装到Configuration中并提供了一系列便利的接口方便各主要的调用方使用，这样就避免了各种配置和元数据信息到处散落的凌乱。</p>
                                    <p data-pid="Vb4UtQu9">3.18 ErrorContext<br>　　ErrorContext定义了一个mybatis内部统一的日志规范，记录了错误信息、发生错误涉及的资源文件、对象、逻辑过程、SQL语句以及出错原因，但是它不会影响运行，如下所示：</p>
                                    <div class="highlight"><pre><code class="language-text">public class ErrorContext {

  private static final String LINE_SEPARATOR = System.getProperty("line.separator","\n");
  private static final ThreadLocal&lt;ErrorContext&gt; LOCAL = new ThreadLocal&lt;ErrorContext&gt;();

  private ErrorContext stored;
  private String resource;
  private String activity;
  private String object;
  private String message;
  private String sql;
  private Throwable cause;

  ...

  public ErrorContext reset() {
    resource = null;
    activity = null;
    object = null;
    message = null;
    sql = null;
    cause = null;
    LOCAL.remove();
    return this;
  }

  @Override
  public String toString() {
    StringBuilder description = new StringBuilder();

    // message
    if (this.message != null) {
      description.append(LINE_SEPARATOR);
      description.append("### ");
      description.append(this.message);
    }

    // resource
    if (resource != null) {
      description.append(LINE_SEPARATOR);
      description.append("### The error may exist in ");
      description.append(resource);
    }

    // object
    if (object != null) {
      description.append(LINE_SEPARATOR);
      description.append("### The error may involve ");
      description.append(object);
    }

    // activity
    if (activity != null) {
      description.append(LINE_SEPARATOR);
      description.append("### The error occurred while ");
      description.append(activity);
    }

    // activity
    if (sql != null) {
      description.append(LINE_SEPARATOR);
      description.append("### SQL: ");
      description.append(sql.replace('\n', ' ').replace('\r', ' ').replace('\t', ' ').trim());
    }

    // cause
    if (cause != null) {
      description.append(LINE_SEPARATOR);
      description.append("### Cause: ");
      description.append(cause.toString());
    }

    return description.toString();
  }

}</code></pre>
                                    </div>
                                    <p data-pid="P6I-iKuf">3.19 BoundSql</p>
                                    <div class="highlight"><pre><code class="language-text">/**
 * An actual SQL String got from an {@link SqlSource} after having processed any dynamic content.
 * The SQL may have SQL placeholders "?" and an list (ordered) of an parameter mappings 
 * with the additional information for each parameter (at least the property name of the input object to read 
 * the value from). 
 * &lt;/br&gt;
 * Can also have additional parameters that are created by the dynamic language (for loops, bind...).
 *
 * SqlSource中包含的SQL处理动态内容之后的实际SQL语句，SQL中会包含?占位符，也就是最终给JDBC的SQL语句，以及他们的参数信息
 * @author Clinton Begin
 */
public class BoundSql {
  // sql文本
  private final String sql;
  // 静态参数说明
  private final List&lt;ParameterMapping&gt; parameterMappings;
  // 运行时参数对象
  private final Object parameterObject;
  // 额外参数，也就是for loops、bind生成的
  private final Map&lt;String, Object&gt; additionalParameters;
  // 额外参数的facade模式包装
  private final MetaObject metaParameters;

  public BoundSql(Configuration configuration, String sql, List&lt;ParameterMapping&gt; parameterMappings, Object parameterObject) {
    this.sql = sql;
    this.parameterMappings = parameterMappings;
    this.parameterObject = parameterObject;
    this.additionalParameters = new HashMap&lt;String, Object&gt;();
    this.metaParameters = configuration.newMetaObject(additionalParameters);
  }

  public String getSql() {
    return sql;
  }

  public List&lt;ParameterMapping&gt; getParameterMappings() {
    return parameterMappings;
  }

  public Object getParameterObject() {
    return parameterObject;
  }

  public boolean hasAdditionalParameter(String name) {
    String paramName = new PropertyTokenizer(name).getName();
    return additionalParameters.containsKey(paramName);
  }

  public void setAdditionalParameter(String name, Object value) {
    metaParameters.setValue(name, value);
  }

  public Object getAdditionalParameter(String name) {
    return metaParameters.getValue(name);
  }
}</code></pre>
                                    </div>
                                    <p></p></div>
                            </div>
                        </div>
                    </div>
                    <div class="ContentItem-time" role="button" tabindex="0">编辑于 2019-05-25 17:40</div>
                    <div class="Post-topicsAndReviewer">
                        <div class="TopicList Post-Topics">
                            <div class="Tag Topic css-1s3a4zw" data-za-detail-view-path-module="TopicItem" data-za-extra-module="{&quot;card&quot;:{&quot;content&quot;:{&quot;type&quot;:&quot;Topic&quot;,&quot;token&quot;:&quot;19582744&quot;}}}"><span class="Tag-content"><a class="TopicLink" href="https://www.zhihu.com/topic/19582744" target="_blank"><div class="css-1gomreu">Java 编程</div></a></span></div>
                            <div class="Tag Topic css-1s3a4zw" data-za-detail-view-path-module="TopicItem" data-za-extra-module="{&quot;card&quot;:{&quot;content&quot;:{&quot;type&quot;:&quot;Topic&quot;,&quot;token&quot;:&quot;19680218&quot;}}}"><span class="Tag-content"><a class="TopicLink" href="https://www.zhihu.com/topic/19680218" target="_blank"><div class="css-1gomreu">MyBatis</div></a></span></div>
                            <div class="Tag Topic css-1s3a4zw" data-za-detail-view-path-module="TopicItem" data-za-extra-module="{&quot;card&quot;:{&quot;content&quot;:{&quot;type&quot;:&quot;Topic&quot;,&quot;token&quot;:&quot;19629329&quot;}}}"><span class="Tag-content"><a class="TopicLink" href="https://www.zhihu.com/topic/19629329" target="_blank"><div class="css-1gomreu">Java 程序员</div></a></span></div>
                        </div>
                    </div>
                    <div>
                        <div class="Sticky RichContent-actions is-fixed is-bottom" style="width: 690px; bottom: 0px; left: 414.6px;">
                            <div class="ContentItem-actions" data-za-detail-view-path-module="BottomBar" data-za-extra-module="{&quot;card&quot;:{&quot;content&quot;:{&quot;type&quot;:&quot;Post&quot;,&quot;id&quot;:&quot;66984738&quot;}}}"><span><button aria-label="赞同 1 " aria-live="polite" class="Button VoteButton VoteButton--up FEfUrdfMIKpQDJDqkjte" type="button"><span style="display:inline-flex;align-items:center">​<svg class="Zi Zi--TriangleUp VoteButton-TriangleUp" fill="currentColor" height="10" viewBox="0 0 24 24" width="10"><path clip-rule="evenodd" d="M13.792 3.681c-.781-1.406-2.803-1.406-3.584 0l-7.79 14.023c-.76 1.367.228 3.046 1.791 3.046h15.582c1.563 0 2.55-1.68 1.791-3.046l-7.79-14.023Z" fill-rule="evenodd"></path></svg></span>赞同 1</button><button aria-label="反对" aria-live="polite" class="Button VoteButton VoteButton--down FEfUrdfMIKpQDJDqkjte" type="button"><span style="display:inline-flex;align-items:center">​<svg class="Zi Zi--TriangleDown" fill="currentColor"
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 height="10"
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 viewBox="0 0 24 24" width="10"><path
                                    clip-rule="evenodd" d="M13.792 20.319c-.781 1.406-2.803 1.406-3.584 0L2.418 6.296c-.76-1.367.228-3.046 1.791-3.046h15.582c1.563 0 2.55 1.68 1.791 3.046l-7.79 14.023Z" fill-rule="evenodd"></path></svg></span></button></span>
                                <button class="Button BottomActions-CommentBtn FEfUrdfMIKpQDJDqkjte Button--plain Button--withIcon Button--withLabel fEPKGkUK5jyc4fUuT0QP B46v1Ak6Gj5sL2JTS4PY RuuQ6TOh2cRzJr6WlyQp" type="button"><span style="display:inline-flex;align-items:center">​<svg class="Zi Zi--Comment Button-zi t2ntD6J1DemdOdvh5FB4" fill="currentColor" height="1.2em" viewBox="0 0 24 24" width="1.2em"><path clip-rule="evenodd" d="M12 2.75a9.25 9.25 0 1 0 4.737 17.197l2.643.817a1 1 0 0 0 1.25-1.25l-.8-2.588A9.25 9.25 0 0 0 12 2.75Z" fill-rule="evenodd"></path></svg></span>添加评论</button>
                                <div class="Popover ShareMenu">
                                    <div aria-expanded="false" aria-haspopup="true" aria-owns="Popover2-content" class="ShareMenu-toggler" id="Popover2-toggle">
                                        <button class="Button FEfUrdfMIKpQDJDqkjte Button--plain Button--withIcon Button--withLabel fEPKGkUK5jyc4fUuT0QP B46v1Ak6Gj5sL2JTS4PY RuuQ6TOh2cRzJr6WlyQp" type="button"><span style="display:inline-flex;align-items:center">​<svg class="Zi Zi--Share Button-zi t2ntD6J1DemdOdvh5FB4" fill="currentColor" height="1.2em" viewBox="0 0 24 24" width="1.2em"><path d="M19.47 1.914a.8.8 0 0 1 1.204.778l-1.872 16.386a.9.9 0 0 1-1.204.743l-4.615-1.692a.7.7 0 0 0-.831.28l-1.927 3.02c-.43.674-1.474.369-1.474-.43v-3.865a.8.8 0 0 1 .179-.504l5.808-7.148a.595.595 0 0 0-.897-.781l-5.93 6.354a1.1 1.1 0 0 1-1.258.252L2.57 13.46a.8.8 0 0 1-.08-1.415l16.98-10.13Z"></path></svg></span>分享</button>
                                    </div>
                                </div>
                                <button aria-live="polite" class="Button ContentItem-action FEfUrdfMIKpQDJDqkjte Button--plain Button--withIcon Button--withLabel fEPKGkUK5jyc4fUuT0QP B46v1Ak6Gj5sL2JTS4PY RuuQ6TOh2cRzJr6WlyQp" type="button"><span style="display:inline-flex;align-items:center">​<svg class="Zi Zi--Heart Button-zi t2ntD6J1DemdOdvh5FB4" fill="currentColor" height="1.2em" viewBox="0 0 24 24" width="1.2em"><path clip-rule="evenodd" d="M12.004 4.934c1.015-.944 2.484-1.618 3.98-1.618 3.48 0 6.53 3.265 6.15 7.614-.11 1.254-.686 2.55-1.458 3.753-.778 1.215-1.79 2.392-2.845 3.419-1.054 1.028-2.168 1.923-3.161 2.566a9.96 9.96 0 0 1-1.41.777c-.418.182-.862.32-1.268.32s-.848-.137-1.267-.317a9.918 9.918 0 0 1-1.407-.771c-.992-.64-2.103-1.53-3.156-2.555-1.052-1.024-2.062-2.2-2.84-3.417-.77-1.208-1.346-2.51-1.456-3.775-.38-4.349 2.67-7.614 6.15-7.614 1.484 0 2.983.673 3.988 1.618Z" fill-rule="evenodd"></path></svg></span>喜欢</button>
                                <button class="Button FEfUrdfMIKpQDJDqkjte Button--plain Button--withIcon Button--withLabel fEPKGkUK5jyc4fUuT0QP B46v1Ak6Gj5sL2JTS4PY RuuQ6TOh2cRzJr6WlyQp" type="button"><span style="display:inline-flex;align-items:center">​<svg class="Zi Zi--Star Button-zi t2ntD6J1DemdOdvh5FB4" fill="currentColor" height="1.2em" viewBox="0 0 24 24" width="1.2em"><path d="M10.484 3.307c.673-1.168 2.358-1.168 3.032 0l2.377 4.122a.25.25 0 0 0 .165.12l4.655.987c1.319.28 1.84 1.882.937 2.884l-3.186 3.535a.25.25 0 0 0-.063.193l.5 4.733c.142 1.34-1.222 2.33-2.453 1.782l-4.346-1.938a.25.25 0 0 0-.204 0l-4.346 1.938c-1.231.549-2.595-.442-2.453-1.782l.5-4.733a.25.25 0 0 0-.064-.193L2.35 11.42c-.903-1.002-.382-2.604.937-2.884l4.655-.987a.25.25 0 0 0 .164-.12l2.378-4.122Z"></path></svg></span>收藏</button>
                                <button class="Button ContentItem-action FEfUrdfMIKpQDJDqkjte Button--plain Button--withIcon Button--withLabel fEPKGkUK5jyc4fUuT0QP B46v1Ak6Gj5sL2JTS4PY RuuQ6TOh2cRzJr6WlyQp" type="button"><span style="display:inline-flex;align-items:center">​<svg class="Zi Zi--Deliver Button-zi t2ntD6J1DemdOdvh5FB4" fill="currentColor" height="1.2em" viewBox="0 0 24 24" width="1.2em"><g clip-rule="evenodd" fill-rule="evenodd"><path d="M7.821 12a.75.75 0 0 1 .75-.75h6.857a.75.75 0 0 1 0 1.5H8.571a.75.75 0 0 1-.75-.75ZM8.965 8a.75.75 0 0 1 .75-.75h4.571a.75.75 0 0 1 0 1.5H9.715a.75.75 0 0 1-.75-.75Z"></path><path d="M7.527 3.15a2.35 2.35 0 0 0-2.309 1.91L3.165 15.84a.85.85 0 0 0-.015.16v2.5a2.35 2.35 0 0 0 2.35 2.35h13a2.35 2.35 0 0 0 2.35-2.35V16a.848.848 0 0 0-.015-.16L18.78 5.06a2.35 2.35 0 0 0-2.308-1.91H7.527Zm0 1.7a.65.65 0 0 0-.639.528l-1.88 9.872h13.984l-1.88-9.872a.65.65 0 0 0-.64-.528H7.528Z"></path></g></svg></span>申请转载</button>
                                <div class="Post-ActionMenuButton">
                                    <div class="Popover">
                                        <div aria-expanded="false" aria-haspopup="true" aria-owns="Popover3-content" id="Popover3-toggle">
                                            <button class="Button FEfUrdfMIKpQDJDqkjte Button--plain Button--withIcon Button--iconOnly fEPKGkUK5jyc4fUuT0QP B46v1Ak6Gj5sL2JTS4PY hIwDV_tcL6XN1HprrnAq" type="button"><span style="display:inline-flex;align-items:center">​<svg class="Zi Zi--Dots Button-zi t2ntD6J1DemdOdvh5FB4" fill="currentColor" height="1.2em" viewBox="0 0 24 24" width="1.2em"><path d="M5.165 13.665a1.665 1.665 0 1 0 0-3.33 1.665 1.665 0 0 0 0 3.33ZM13.665 12a1.665 1.665 0 1 1-3.33 0 1.665 1.665 0 0 1 3.33 0ZM18.835 13.665a1.665 1.665 0 1 0 0-3.33 1.665 1.665 0 0 0 0 3.33Z"></path></svg></span></button>
                                        </div>
                                    </div>
                                </div>
                            </div>
                            <div class="Post-SideActions" style="opacity: 1;">
                                <button class="like">
                                    <div class="Post-SideActions-icon">
                                        <svg class="Zi Zi--TriangleUp Post-SideActions-upIcon" fill="currentColor" height="16" viewBox="0 0 24 24" width="16">
                                            <path clip-rule="evenodd" d="M13.792 3.681c-.781-1.406-2.803-1.406-3.584 0l-7.79 14.023c-.76 1.367.228 3.046 1.791 3.046h15.582c1.563 0 2.55-1.68 1.791-3.046l-7.79-14.023Z" fill-rule="evenodd"></path>
                                        </svg>
                                    </div>
                                    <div class="likeCount">
                                        <div class="likeCount-inner" data-previous="已赞同 2">赞同 1</div>
                                    </div>
                                </button>
                                <div class="Popover ShareMenu">
                                    <div aria-expanded="false" aria-haspopup="true" aria-owns="Popover8-content" class="ShareMenu-toggler" id="Popover8-toggle">
                                        <button>
                                            <div class="Post-SideActions-icon"><span style="display: inline-flex; align-items: center;">​<svg class="Zi Zi--Share" fill="currentColor" height="20" viewBox="0 0 24 24" width="20"><path d="M19.47 1.914a.8.8 0 0 1 1.204.778l-1.872 16.386a.9.9 0 0 1-1.204.743l-4.615-1.692a.7.7 0 0 0-.831.28l-1.927 3.02c-.43.674-1.474.369-1.474-.43v-3.865a.8.8 0 0 1 .179-.504l5.808-7.148a.595.595 0 0 0-.897-.781l-5.93 6.354a1.1 1.1 0 0 1-1.258.252L2.57 13.46a.8.8 0 0 1-.08-1.415l16.98-10.13Z"></path></svg></span></div>
                                            分享
                                        </button>
                                    </div>
                                </div>
                            </div>
                        </div>
                        <div class="Sticky--holder" style="position: static; inset: auto auto 0px 0px; display: block; float: none; margin: 0px 0px 10px; height: 53.6px;"></div>
                    </div>
                </article>
                <div class="Post-Sub Post-NormalSub">
                    <div data-za-detail-view-path-module="CommentList" data-za-extra-module="{}" style="overflow: unset;">
                        <div class="Comments-container css-plbgu">
                            <div class="css-79elbk">
                                <div>
                                    <div class="css-1fo89v5">
                                        <div class="css-iin461">
                                            <div class="css-i6bazn">
                                                <div class="css-0">
                                                    <div class="InputLike css-ip4bff Editable">
                                                        <div class="Dropzone Editable-content RichText RichText--editable RichText--clearBoth ztext" style="min-height: 38px;">
                                                            <div class="DraftEditor-root">
                                                                <div class="public-DraftEditorPlaceholder-root">
                                                                    <div class="public-DraftEditorPlaceholder-inner" id="placeholder-39r4b" style="white-space: pre-wrap;">写下你的评论...</div>
                                                                </div>
                                                                <div class="DraftEditor-editorContainer">
                                                                    <div aria-describedby="placeholder-39r4b" class="notranslate public-DraftEditor-content" contenteditable="true" role="textbox" spellcheck="true" style="outline: none; user-select: text; white-space: pre-wrap; overflow-wrap: break-word;" tabindex="0">
                                                                        <div data-contents="true">
                                                                            <div class="Editable-unstyled" data-block="true" data-editor="39r4b" data-offset-key="80obn-0-0">
                                                                                <div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="80obn-0-0"><span data-offset-key="80obn-0-0"><br data-text="true"></span></div>
                                                                            </div>
                                                                        </div>
                                                                    </div>
                                                                </div>
                                                            </div>
                                                        </div>
                                                        <div></div>
                                                        <input accept="image/webp,image/jpg,image/jpeg,image/png,image/gif" multiple="" style="display: none;" type="file"></div>
                                                </div>
                                            </div>
                                        </div>
                                    </div>
                                </div>
                                <div class="css-1ki0pxd">
                                    <div class="css-jzppqm">
                                        <div class="css-1vjm6vs"></div>
                                        <div class="css-1goiptz">
                                            <div class="css-1jroejq">
                                                <svg fill="none" height="160" viewBox="0 0 160 160" width="160" xmlns="http://www.w3.org/2000/svg">
                                                    <path d="M128.05 86.7399H137.6C140.497 86.7242 143.27 85.5665 145.318 83.5183C147.367 81.47 148.524 78.6965 148.54 75.7999C148.524 72.9033 147.367 70.1298 145.318 68.0816C143.27 66.0333 140.497 64.8757 137.6 64.8599H135.11C134.109 64.3682 133.269 63.6005 132.69 62.6473C132.11 61.6941 131.815 60.5951 131.84 59.4799C131.823 58.4532 132.073 57.4397 132.566 56.5387C133.059 55.6377 133.777 54.88 134.65 54.3399H136.38C137.624 54.3808 138.863 54.1711 140.024 53.7233C141.185 53.2756 142.244 52.599 143.138 51.7337C144.032 50.8684 144.743 49.8321 145.229 48.6865C145.714 47.5408 145.965 46.3092 145.965 45.0649C145.965 43.8206 145.714 42.589 145.229 41.4434C144.743 40.2977 144.032 39.2614 143.138 38.3961C142.244 37.5308 141.185 36.8542 140.024 36.4065C138.863 35.9587 137.624 35.7491 136.38 35.7899H51.38C50.1363 35.7491 48.8972 35.9587 47.7362 36.4065C46.5753 36.8542 45.5162 37.5308 44.622 38.3961C43.7278 39.2614 43.0168 40.2977 42.5312 41.4434C42.0456 42.589 41.7954 43.8206 41.7954 45.0649C41.7954 46.3092 42.0456 47.5408 42.5312 48.6865C43.0168 49.8321 43.7278 50.8684 44.622 51.7337C45.5162 52.599 46.5753 53.2756 47.7362 53.7233C48.8972 54.1711 50.1363 54.3808 51.38 54.3399H57C57.8686 54.8851 58.583 55.6438 59.0749 56.5437C59.5668 57.4435 59.8199 58.4544 59.81 59.4799C59.8321 60.5946 59.5364 61.6926 58.9573 62.6454C58.3782 63.5982 57.5397 64.3663 56.54 64.8599H42.72C39.8234 64.8757 37.0499 66.0333 35.0016 68.0816C32.9534 70.1298 31.7957 72.9033 31.78 75.7999C31.7957 78.6965 32.9534 81.47 35.0016 83.5183C37.0499 85.5665 39.8234 86.7242 42.72 86.7399H53C55.0187 86.8334 56.9221 87.7078 58.3083 89.1785C59.6944 90.6491 60.4548 92.6009 60.4288 94.6216C60.4029 96.6424 59.5926 98.574 58.1692 100.009C56.7457 101.443 54.8205 102.268 52.8 102.31H24.26C21.509 102.394 18.899 103.547 16.9829 105.523C15.0669 107.498 13.9954 110.143 13.9954 112.895C13.9954 115.647 15.0669 118.291 16.9829 120.267C18.899 122.243 21.509 123.395 24.26 123.48H134.84C136.257 123.523 137.669 123.282 138.991 122.77C140.314 122.257 141.52 121.485 142.538 120.497C143.556 119.51 144.365 118.328 144.918 117.023C145.471 115.717 145.755 114.313 145.755 112.895C145.755 111.477 145.471 110.073 144.918 108.767C144.365 107.461 143.556 106.28 142.538 105.292C141.52 104.305 140.314 103.533 138.991 103.02C137.669 102.508 136.257 102.266 134.84 102.31H128.25C126.229 102.268 124.304 101.443 122.881 100.009C121.457 98.574 120.647 96.6424 120.621 94.6216C120.595 92.6009 121.356 90.6491 122.742 89.1785C124.128 87.7078 126.031 86.8334 128.05 86.7399Z"
                                                          fill="#E6E6E6"></path>
                                                    <path d="M68.4899 123.75H66.1899V118.25C66.9407 118.471 67.7391 118.471 68.4899 118.25V123.75Z" fill="white"></path>
                                                    <path d="M68.4899 118.25H66.1899V120.01H68.4899V118.25Z" fill="#E6E6E6"></path>
                                                    <path d="M46.7201 65.48H43.5601V114.51H46.7201V65.48Z" fill="white"></path>
                                                    <path d="M149.83 124.21H10.17C10.048 124.21 9.93096 124.162 9.84469 124.075C9.75843 123.989 9.70996 123.872 9.70996 123.75C9.71251 123.629 9.7618 123.513 9.84752 123.428C9.93324 123.342 10.0488 123.293 10.17 123.29H149.83C149.951 123.293 150.067 123.342 150.152 123.428C150.238 123.513 150.287 123.629 150.29 123.75C150.29 123.81 150.278 123.87 150.255 123.926C150.232 123.982 150.198 124.033 150.155 124.075C150.113 124.118 150.062 124.152 150.006 124.175C149.95 124.198 149.89 124.21 149.83 124.21Z" fill="#333333"></path>
                                                    <path d="M66.7801 46.6299H58.4801C57.4859 46.6299 56.6801 47.4358 56.6801 48.4299V56.7299C56.6801 57.724 57.4859 58.5299 58.4801 58.5299H66.7801C67.7742 58.5299 68.5801 57.724 68.5801 56.7299V48.4299C68.5801 47.4358 67.7742 46.6299 66.7801 46.6299Z" fill="#F2F2F2"></path>
                                                    <path d="M89.89 46.6299H81.59C80.5959 46.6299 79.79 47.4358 79.79 48.4299V56.7299C79.79 57.724 80.5959 58.5299 81.59 58.5299H89.89C90.8842 58.5299 91.69 57.724 91.69 56.7299V48.4299C91.69 47.4358 90.8842 46.6299 89.89 46.6299Z" fill="#F2F2F2"></path>
                                                    <path d="M66.57 67.5901H58.27C57.2759 67.5901 56.47 68.396 56.47 69.3901V77.6901C56.47 78.6842 57.2759 79.4901 58.27 79.4901H66.57C67.5641 79.4901 68.37 78.6842 68.37 77.6901V69.3901C68.37 68.396 67.5641 67.5901 66.57 67.5901Z" fill="#F2F2F2"></path>
                                                    <path d="M89.89 67.5901H81.59C80.5959 67.5901 79.79 68.396 79.79 69.3901V77.6901C79.79 78.6842 80.5959 79.4901 81.59 79.4901H89.89C90.8842 79.4901 91.69 78.6842 91.69 77.6901V69.3901C91.69 68.396 90.8842 67.5901 89.89 67.5901Z" fill="#F2F2F2"></path>
                                                    <path d="M60.0499 50.25C60.6575 50.25 61.15 49.7576 61.15 49.1501C61.15 48.5425 60.6575 48.05 60.0499 48.05C59.4424 48.05 58.95 48.5425 58.95 49.1501C58.95 49.7576 59.4424 50.25 60.0499 50.25Z" fill="white"></path>
                                                    <path d="M64.9 56.9799C66.0266 56.9799 66.94 56.0666 66.94 54.9399C66.94 53.8132 66.0266 52.8999 64.9 52.8999C63.7733 52.8999 62.86 53.8132 62.86 54.9399C62.86 56.0666 63.7733 56.9799 64.9 56.9799Z" fill="white"></path>
                                                    <path d="M65.84 70.9499C66.3978 70.9499 66.85 70.4977 66.85 69.9399C66.85 69.3821 66.3978 68.9299 65.84 68.9299C65.2821 68.9299 64.83 69.3821 64.83 69.9399C64.83 70.4977 65.2821 70.9499 65.84 70.9499Z" fill="white"></path>
                                                    <path d="M62.26 71.46C62.4644 71.46 62.63 71.2943 62.63 71.09C62.63 70.8856 62.4644 70.72 62.26 70.72C62.0557 70.72 61.89 70.8856 61.89 71.09C61.89 71.2943 62.0557 71.46 62.26 71.46Z" fill="white"></path>
                                                    <path d="M82.86 52.4701C83.3129 52.4701 83.68 52.103 83.68 51.6501C83.68 51.1972 83.3129 50.8301 82.86 50.8301C82.4072 50.8301 82.04 51.1972 82.04 51.6501C82.04 52.103 82.4072 52.4701 82.86 52.4701Z" fill="white"></path>
                                                    <path d="M87.61 55.89C87.7978 55.89 87.95 55.7377 87.95 55.55C87.95 55.3622 87.7978 55.21 87.61 55.21C87.4222 55.21 87.27 55.3622 87.27 55.55C87.27 55.7377 87.4222 55.89 87.61 55.89Z" fill="white"></path>
                                                    <path d="M65.32 48.87C65.5465 48.87 65.73 48.6865 65.73 48.46C65.73 48.2336 65.5465 48.05 65.32 48.05C65.0936 48.05 64.91 48.2336 64.91 48.46C64.91 48.6865 65.0936 48.87 65.32 48.87Z" fill="white"></path>
                                                    <path d="M59.74 54.87C59.9664 54.87 60.15 54.6865 60.15 54.46C60.15 54.2336 59.9664 54.05 59.74 54.05C59.5135 54.05 59.33 54.2336 59.33 54.46C59.33 54.6865 59.5135 54.87 59.74 54.87Z" fill="white"></path>
                                                    <path d="M58.7999 49.86C58.5299 49.86 58.3099 49.86 58.2699 49.65C58.2299 49.44 58.3799 49.32 58.7599 49.13C59.137 48.9536 59.5284 48.8097 59.9299 48.7C60.2299 48.62 61.7199 48.24 61.8399 48.7C61.9599 49.14 60.4799 49.56 60.1799 49.64C59.7294 49.7638 59.2666 49.8376 58.7999 49.86ZM58.5399 49.58C59.0713 49.6149 59.6043 49.547 60.1099 49.38C60.6312 49.2767 61.1251 49.0655 61.5599 48.76C61.0287 48.7265 60.4965 48.8084 59.9999 49C59.4789 49.092 58.9821 49.2894 58.5399 49.58Z" fill="white"></path>
                                                    <path d="M112.25 46.6299H103.95C102.956 46.6299 102.15 47.4358 102.15 48.4299V56.7299C102.15 57.724 102.956 58.5299 103.95 58.5299H112.25C113.244 58.5299 114.05 57.724 114.05 56.7299V48.4299C114.05 47.4358 113.244 46.6299 112.25 46.6299Z" fill="#F2F2F2"></path>
                                                    <path d="M135.37 46.6299H127.07C126.076 46.6299 125.27 47.4358 125.27 48.4299V56.7299C125.27 57.724 126.076 58.5299 127.07 58.5299H135.37C136.364 58.5299 137.17 57.724 137.17 56.7299V48.4299C137.17 47.4358 136.364 46.6299 135.37 46.6299Z" fill="#F2F2F2"></path>
                                                    <path d="M116.28 82.3999H99.49C99.3688 82.3974 99.2533 82.3481 99.1676 82.2624C99.0819 82.1767 99.0326 82.0611 99.03 81.9399V65.1499C99.03 65.027 99.0781 64.9089 99.1641 64.8211C99.2501 64.7332 99.3671 64.6825 99.49 64.6799H116.28C116.341 64.6799 116.402 64.6921 116.458 64.7159C116.515 64.7396 116.566 64.7744 116.609 64.8182C116.652 64.862 116.685 64.9139 116.708 64.9708C116.73 65.0278 116.741 65.0887 116.74 65.1499V81.9399C116.74 82.0619 116.692 82.1789 116.605 82.2652C116.519 82.3515 116.402 82.3999 116.28 82.3999ZM100 81.4799H115.87V65.6099H100V81.4799Z" fill="#E8E8E8"></path>
                                                    <path d="M112.04 67.5901H103.74C102.746 67.5901 101.94 68.396 101.94 69.3901V77.6901C101.94 78.6842 102.746 79.4901 103.74 79.4901H112.04C113.034 79.4901 113.84 78.6842 113.84 77.6901V69.3901C113.84 68.396 113.034 67.5901 112.04 67.5901Z" fill="#F2F2F2"></path>
                                                    <path d="M135.37 67.5901H127.07C126.076 67.5901 125.27 68.396 125.27 69.3901V77.6901C125.27 78.6842 126.076 79.4901 127.07 79.4901H135.37C136.364 79.4901 137.17 78.6842 137.17 77.6901V69.3901C137.17 68.396 136.364 67.5901 135.37 67.5901Z" fill="#F2F2F2"></path>
                                                    <path d="M105.52 50.25C106.128 50.25 106.62 49.7576 106.62 49.1501C106.62 48.5425 106.128 48.05 105.52 48.05C104.913 48.05 104.42 48.5425 104.42 49.1501C104.42 49.7576 104.913 50.25 105.52 50.25Z" fill="white"></path>
                                                    <path d="M110.37 56.9799C111.497 56.9799 112.41 56.0666 112.41 54.9399C112.41 53.8132 111.497 52.8999 110.37 52.8999C109.243 52.8999 108.33 53.8132 108.33 54.9399C108.33 56.0666 109.243 56.9799 110.37 56.9799Z" fill="white"></path>
                                                    <path d="M111.31 70.9499C111.868 70.9499 112.32 70.4977 112.32 69.9399C112.32 69.3821 111.868 68.9299 111.31 68.9299C110.752 68.9299 110.3 69.3821 110.3 69.9399C110.3 70.4977 110.752 70.9499 111.31 70.9499Z" fill="white"></path>
                                                    <path d="M107.74 71.46C107.944 71.46 108.11 71.2943 108.11 71.09C108.11 70.8856 107.944 70.72 107.74 70.72C107.536 70.72 107.37 70.8856 107.37 71.09C107.37 71.2943 107.536 71.46 107.74 71.46Z" fill="white"></path>
                                                    <path d="M128.33 52.4701C128.783 52.4701 129.15 52.103 129.15 51.6501C129.15 51.1972 128.783 50.8301 128.33 50.8301C127.877 50.8301 127.51 51.1972 127.51 51.6501C127.51 52.103 127.877 52.4701 128.33 52.4701Z" fill="white"></path>
                                                    <path d="M133.08 55.89C133.268 55.89 133.42 55.7377 133.42 55.55C133.42 55.3622 133.268 55.21 133.08 55.21C132.892 55.21 132.74 55.3622 132.74 55.55C132.74 55.7377 132.892 55.89 133.08 55.89Z" fill="white"></path>
                                                    <path d="M110.79 48.87C111.016 48.87 111.2 48.6865 111.2 48.46C111.2 48.2336 111.016 48.05 110.79 48.05C110.564 48.05 110.38 48.2336 110.38 48.46C110.38 48.6865 110.564 48.87 110.79 48.87Z" fill="white"></path>
                                                    <path d="M105.21 54.87C105.436 54.87 105.62 54.6865 105.62 54.46C105.62 54.2336 105.436 54.05 105.21 54.05C104.984 54.05 104.8 54.2336 104.8 54.46C104.8 54.6865 104.984 54.87 105.21 54.87Z" fill="white"></path>
                                                    <path d="M104.27 49.86C104 49.86 103.78 49.86 103.74 49.65C103.7 49.44 103.85 49.32 104.23 49.13C104.607 48.9536 104.999 48.8097 105.4 48.7C105.7 48.62 107.19 48.24 107.31 48.7C107.31 48.86 107.2 49.03 106.82 49.22C106.444 49.397 106.053 49.5377 105.65 49.64C105.2 49.7638 104.737 49.8376 104.27 49.86ZM104.02 49.58C104.548 49.6144 105.078 49.5464 105.58 49.38C106.101 49.2767 106.595 49.0655 107.03 48.76C105.973 48.7505 104.935 49.0343 104.03 49.58H104.02Z" fill="white"></path>
                                                    <path d="M96.8199 84.0001C96.8199 84.0001 99.0999 75.3701 99.8199 74.0001C100.54 72.6301 131.2 75.4601 135.75 77.0801C140.3 78.7001 136.33 123.75 136.33 123.75H96.8199V84.0001Z" fill="white"></path>
                                                    <path d="M121.94 114.69C121.94 114.69 125.76 115.86 128.25 113.42C130.74 110.98 130.75 78.2501 135.74 77.0801C140.73 75.9101 136.62 110.39 136.32 123.75H121.94V114.69Z" fill="#F2F2F2"></path>
                                                    <path d="M97.9999 81.38C97.9999 81.38 101.81 80.38 101.89 87.65H111.41C111.41 87.65 117.5 82.18 119.41 82.27C121.32 82.36 121.86 91.56 121.86 91.56C121.86 91.56 124.6 92.66 124.7 99.84C124.7 99.84 121.27 112.56 120.59 115.84C119.91 119.12 105.72 107.92 105.72 107.92L96.8899 95.86L96.8199 84L97.9999 81.38Z" fill="#F2F2F2"></path>
                                                    <path d="M136.32 124.21H96.82C96.7592 124.211 96.6988 124.2 96.6424 124.178C96.5859 124.155 96.5347 124.121 96.4917 124.078C96.4487 124.035 96.4149 123.984 96.3922 123.928C96.3696 123.871 96.3586 123.811 96.36 123.75V84.0001C96.3551 83.9602 96.3551 83.9199 96.36 83.8801C96.45 83.5201 98.67 75.1801 99.36 73.8801C99.53 73.5601 99.74 73.1601 105.05 73.3301C107.98 73.4301 111.98 73.6901 116.33 74.0801C124.02 74.7601 133.41 75.8801 135.85 76.7401C137.21 77.2301 138.92 80.2801 138.16 101.14C137.74 112.48 136.75 123.78 136.74 123.89C136.711 123.98 136.656 124.059 136.581 124.116C136.505 124.174 136.414 124.206 136.32 124.21ZM97.32 123.29H135.9C136.08 121.14 136.9 111.09 137.28 101C137.52 94.3601 137.53 89.0001 137.28 85.0801C136.88 78.4801 135.87 77.6201 135.57 77.5101C133.57 76.8101 125.91 75.7601 116.84 74.9401C106.95 74.0501 101.03 73.9401 100.16 74.2901C99.57 75.5301 97.9 81.6301 97.27 84.0101L97.32 123.29Z" fill="#333333"></path>
                                                    <path d="M121.94 112.6C121.88 112.594 121.821 112.576 121.768 112.547C121.715 112.517 121.669 112.478 121.632 112.43C121.594 112.383 121.567 112.328 121.551 112.269C121.535 112.211 121.532 112.15 121.54 112.09C122.632 104.661 124.767 97.4232 127.88 90.5901C127.932 90.4787 128.026 90.3924 128.141 90.3502C128.256 90.308 128.384 90.3134 128.495 90.3651C128.606 90.4168 128.693 90.5106 128.735 90.626C128.777 90.7413 128.772 90.8687 128.72 90.9801C125.644 97.7239 123.533 104.867 122.45 112.2C122.433 112.319 122.37 112.428 122.275 112.502C122.18 112.577 122.06 112.612 121.94 112.6Z" fill="#333333"></path>
                                                    <path d="M46.72 115H43.56C43.4388 114.998 43.3233 114.948 43.2375 114.863C43.1518 114.777 43.1025 114.661 43.1 114.54V65.5401C43.1025 65.4189 43.1518 65.3033 43.2375 65.2176C43.3233 65.1319 43.4388 65.0826 43.56 65.0801H46.72C46.8412 65.0826 46.9567 65.1319 47.0424 65.2176C47.1281 65.3033 47.1774 65.4189 47.18 65.5401V114.54C47.1774 114.661 47.1281 114.777 47.0424 114.863C46.9567 114.948 46.8412 114.998 46.72 115ZM44.02 114.08H46.26V65.9401H44L44.02 114.08Z" fill="#333333"></path>
                                                    <path d="M37.25 73.38V106.61L43.56 114.51V65.48L37.25 73.38Z" fill="#DCDCDC"></path>
                                                    <path d="M43.56 115C43.4914 114.999 43.4237 114.983 43.3616 114.954C43.2995 114.925 43.2444 114.882 43.2 114.83L36.89 106.93C36.8279 106.85 36.7929 106.752 36.79 106.65V73.38C36.7908 73.275 36.8259 73.1731 36.89 73.09L43.2 65.19C43.2619 65.1162 43.345 65.0632 43.438 65.0381C43.531 65.0131 43.6295 65.0172 43.72 65.05C43.8087 65.0813 43.8853 65.1397 43.9391 65.2168C43.9929 65.2939 44.0212 65.386 44.02 65.48V114.48C44.02 114.602 43.9716 114.719 43.8853 114.805C43.799 114.892 43.682 114.94 43.56 114.94V115ZM37.71 106.48L43.1 113.23V66.79L37.71 73.54V106.48Z" fill="#333333"></path>
                                                    <path d="M37.25 82.54C37.25 82.54 24.25 89.41 24.25 123.75H37.25L32.41 116.16C32.41 116.16 30.94 100.94 37.25 96.27V82.54Z" fill="#DCDCDC"></path>
                                                    <path d="M37.25 124.21H24.25C24.128 124.21 24.011 124.162 23.9248 124.075C23.8385 123.989 23.79 123.872 23.79 123.75C23.79 109.84 25.88 98.75 30 90.75C32.95 85 36.07 82.75 37 82.21C37.0805 82.158 37.1742 82.1302 37.27 82.13C37.3308 82.1286 37.3913 82.1396 37.4477 82.1622C37.5041 82.1849 37.5554 82.2187 37.5984 82.2617C37.6413 82.3047 37.6752 82.3559 37.6978 82.4124C37.7204 82.4688 37.7314 82.5292 37.73 82.59V96.27C37.7308 96.3414 37.715 96.412 37.6837 96.4762C37.6525 96.5405 37.6067 96.5965 37.55 96.64C31.79 100.9 32.76 114.64 32.88 116.01L37.66 123.5C37.7052 123.57 37.7306 123.65 37.7336 123.733C37.7366 123.816 37.7171 123.899 37.6771 123.971C37.6371 124.044 37.5781 124.105 37.5065 124.147C37.4348 124.189 37.3531 124.211 37.27 124.21H37.25ZM24.72 123.29H36.41L32 116.41C31.9634 116.345 31.9397 116.274 31.93 116.2C31.7143 113.443 31.7344 110.673 31.99 107.92C32.55 102.1 34.16 98.11 36.77 96.05V83.41C34.2279 85.516 32.1796 88.1549 30.77 91.14C26.82 98.93 24.77 109.74 24.72 123.29Z"
                                                          fill="#333333"></path>
                                                    <path d="M72.34 113.7C72.084 113.7 71.8322 113.635 71.6083 113.51C71.3844 113.386 71.1957 113.207 71.06 112.99C70.69 112.41 69.06 111.91 68 111.78C67.7863 111.778 67.5754 111.731 67.3811 111.642C67.1868 111.553 67.0134 111.424 66.8723 111.264C66.7312 111.103 66.6255 110.915 66.5622 110.71C66.4988 110.506 66.4793 110.291 66.5047 110.079C66.5302 109.867 66.6001 109.662 66.71 109.479C66.8198 109.296 66.967 109.137 67.1421 109.015C67.3172 108.892 67.5162 108.808 67.726 108.767C67.9359 108.727 68.1519 108.731 68.36 108.78C69.01 108.86 72.36 109.35 73.62 111.38C73.8344 111.719 73.9063 112.128 73.8202 112.52C73.734 112.911 73.4968 113.253 73.16 113.47C72.9133 113.621 72.6294 113.701 72.34 113.7Z" fill="#333333"></path>
                                                    <path d="M67.3399 118.41C69.4938 118.41 71.2399 116.664 71.2399 114.51C71.2399 112.356 69.4938 110.61 67.3399 110.61C65.186 110.61 63.4399 112.356 63.4399 114.51C63.4399 116.664 65.186 118.41 67.3399 118.41Z" fill="white"></path>
                                                    <path d="M67.3399 118.41C69.4938 118.41 71.2399 116.664 71.2399 114.51C71.2399 112.356 69.4938 110.61 67.3399 110.61C65.186 110.61 63.4399 112.356 63.4399 114.51C63.4399 116.664 65.186 118.41 67.3399 118.41Z" fill="#DCDCDC"></path>
                                                    <path d="M67.34 118.87C66.4752 118.87 65.6299 118.613 64.9111 118.133C64.1922 117.652 63.6321 116.969 63.3017 116.17C62.9712 115.371 62.8852 114.492 63.0547 113.644C63.2241 112.796 63.6413 112.017 64.2535 111.406C64.8656 110.796 65.6452 110.38 66.4936 110.213C67.3419 110.045 68.2209 110.133 69.0192 110.465C69.8176 110.798 70.4994 111.359 70.9783 112.079C71.4573 112.799 71.7119 113.645 71.71 114.51C71.71 115.083 71.5969 115.651 71.3771 116.181C71.1574 116.71 70.8353 117.191 70.4294 117.596C70.0235 118.001 69.5417 118.322 69.0115 118.541C68.4814 118.759 67.9134 118.871 67.34 118.87ZM67.34 111.06C66.6576 111.06 65.9906 111.262 65.4232 111.641C64.8559 112.02 64.4137 112.559 64.1526 113.19C63.8915 113.82 63.8231 114.514 63.9563 115.183C64.0894 115.852 64.418 116.467 64.9004 116.949C65.3829 117.432 65.9977 117.76 66.6669 117.894C67.3361 118.027 68.0298 117.958 68.6602 117.697C69.2906 117.436 69.8294 116.994 70.2085 116.427C70.5876 115.859 70.79 115.192 70.79 114.51C70.79 113.595 70.4265 112.717 69.7795 112.07C69.1325 111.423 68.255 111.06 67.34 111.06Z"
                                                          fill="#333333"></path>
                                                    <path d="M68.49 124.21H66.19C66.068 124.21 65.951 124.162 65.8647 124.075C65.7784 123.989 65.73 123.872 65.73 123.75V118.25C65.7314 118.179 65.7482 118.109 65.7793 118.045C65.8103 117.981 65.8549 117.925 65.91 117.88C65.9675 117.84 66.0331 117.813 66.1022 117.801C66.1713 117.789 66.2422 117.792 66.31 117.81C66.9644 117.991 67.6555 117.991 68.31 117.81C68.3774 117.789 68.4489 117.784 68.5185 117.796C68.5882 117.808 68.6538 117.837 68.71 117.88C68.7691 117.922 68.8172 117.977 68.8503 118.042C68.8834 118.106 68.9004 118.178 68.9 118.25V123.75C68.9007 123.864 68.8591 123.974 68.7834 124.059C68.7077 124.144 68.6031 124.198 68.49 124.21ZM66.65 123.29H68V118.82C67.5426 118.89 67.0773 118.89 66.62 118.82L66.65 123.29Z" fill="#333333"></path>
                                                    <path d="M77.19 114.58C75.3943 114.573 73.6223 114.17 72 113.4C71.8195 113.317 71.6571 113.199 71.5222 113.052C71.3873 112.906 71.2825 112.735 71.2137 112.548C71.145 112.362 71.1137 112.163 71.1217 111.965C71.1296 111.766 71.1766 111.571 71.26 111.39C71.3434 111.209 71.4616 111.047 71.6077 110.912C71.7538 110.777 71.9251 110.672 72.1118 110.604C72.2984 110.535 72.4968 110.504 72.6955 110.512C72.8942 110.52 73.0895 110.567 73.27 110.65C74.503 111.262 75.8632 111.574 77.2396 111.56C78.6161 111.546 79.9697 111.207 81.19 110.57C81.5339 110.363 81.9455 110.301 82.3351 110.397C82.7247 110.492 83.0608 110.738 83.27 111.08C83.3748 111.247 83.4454 111.434 83.478 111.628C83.5106 111.823 83.5044 112.022 83.4598 112.215C83.4152 112.407 83.3331 112.589 83.2181 112.749C83.1032 112.91 82.9577 113.046 82.79 113.15C81.0799 114.107 79.1494 114.6 77.19 114.58Z" fill="#333333"></path>
                                                    <path d="M67.34 114C66.9971 113.996 66.6656 113.876 66.3995 113.66C66.1334 113.444 65.9482 113.144 65.8741 112.809C65.7999 112.474 65.8412 112.124 65.9911 111.816C66.141 111.507 66.3909 111.259 66.7 111.11C68.27 110.419 69.9988 110.17 71.7 110.39C71.9025 110.415 72.0978 110.481 72.2744 110.583C72.4509 110.686 72.6051 110.822 72.7276 110.986C72.8502 111.149 72.9386 111.335 72.9876 111.533C73.0367 111.731 73.0454 111.937 73.0131 112.139C72.9809 112.34 72.9084 112.533 72.8 112.706C72.6916 112.879 72.5495 113.028 72.3821 113.145C72.2148 113.262 72.0256 113.344 71.826 113.386C71.6263 113.428 71.4202 113.429 71.22 113.39C70.1076 113.261 68.9808 113.423 67.95 113.86C67.7592 113.951 67.5511 113.998 67.34 114Z" fill="#333333"></path>
                                                    <path d="M69.06 116.1C68.7907 116.096 68.5271 116.022 68.2958 115.884C68.0646 115.746 67.8739 115.549 67.743 115.314C67.6121 115.078 67.5457 114.812 67.5504 114.543C67.5551 114.274 67.6309 114.011 67.77 113.78C68.5471 112.671 69.532 111.724 70.67 110.99C71.0072 110.807 71.4013 110.757 71.7732 110.853C72.1451 110.948 72.4672 111.18 72.6749 111.503C72.8825 111.826 72.9603 112.215 72.8926 112.593C72.8249 112.971 72.6168 113.309 72.31 113.54C71.5349 114.024 70.8567 114.648 70.31 115.38C70.1762 115.593 69.9924 115.77 69.7745 115.895C69.5566 116.021 69.3113 116.091 69.06 116.1Z" fill="#333333"></path>
                                                    <path d="M82.4801 102.76C82.4801 102.76 81.63 115.63 81.63 123.76H121.94C121.94 123.76 122.04 102.43 121.16 98.3199C120.802 96.1368 119.867 94.0892 118.45 92.3899C118.45 92.3899 119.15 83.3299 115.85 82.9599C111.06 82.4299 104.33 90.2999 104.33 90.2999C104.33 90.2999 93.4701 90.4899 90.3301 90.7899C90.3301 90.7899 81.33 88.9299 77.6 88.4399C73.87 87.9499 72.7201 95.6699 73.8001 98.5999C74.8801 101.53 82.4801 102.76 82.4801 102.76Z" fill="white"></path>
                                                    <path d="M81.65 118.25H114.17V123.75H81.63L81.65 118.25Z" fill="#F2F2F2"></path>
                                                    <path d="M121.16 98.31C120.802 96.1269 119.867 94.0793 118.45 92.38C118.45 92.38 119.15 83.32 115.85 82.95C115.518 82.9128 115.182 82.9128 114.85 82.95C114.85 82.95 115.08 89.26 113.1 91.95C113.1 91.95 115.74 92.4701 113.98 123.73H121.91C121.91 123.73 122 102.42 121.16 98.31Z" fill="#F2F2F2"></path>
                                                    <path d="M86.08 103.91H86L82.41 103.22C82.3505 103.21 82.2935 103.189 82.2424 103.157C82.1914 103.125 82.1473 103.083 82.1128 103.033C82.0782 102.984 82.054 102.928 82.0415 102.869C82.029 102.81 82.0285 102.749 82.04 102.69C82.0508 102.63 82.0734 102.573 82.1065 102.522C82.1395 102.471 82.1824 102.426 82.2327 102.392C82.2829 102.358 82.3395 102.334 82.3991 102.321C82.4587 102.309 82.5202 102.308 82.58 102.32L86.18 103.01C86.2386 103.021 86.2945 103.043 86.3444 103.076C86.3944 103.108 86.4373 103.15 86.4708 103.2C86.5043 103.249 86.5277 103.304 86.5395 103.363C86.5514 103.421 86.5516 103.481 86.54 103.54C86.5189 103.646 86.4613 103.741 86.3772 103.808C86.2931 103.876 86.1879 103.912 86.08 103.91Z" fill="#333333"></path>
                                                    <path d="M87.37 90.18C87.37 90.18 93.52 83 96.53 83C99.54 83 98.82 90.46 98.82 90.46L90.34 90.83L87.37 90.18Z" fill="white"></path>
                                                    <path d="M95.46 83.19C95.46 83.19 95.36 86.91 94.08 88.6L88.64 88.76L87.37 90.18L90.37 90.78L98.85 90.41C98.85 90.41 99.83 81.6 95.46 83.19Z" fill="#F2F2F2"></path>
                                                    <path d="M121.94 124.21H81.63C81.5692 124.211 81.5088 124.2 81.4523 124.178C81.3959 124.155 81.3446 124.121 81.3017 124.078C81.2587 124.035 81.2248 123.984 81.2022 123.928C81.1796 123.871 81.1686 123.811 81.17 123.75C81.17 116.52 81.85 105.41 82 103.14C80.35 102.83 74.38 101.53 73.37 98.76C72.5 96.39 72.99 91.54 74.82 89.26C75.1349 88.8075 75.5684 88.4505 76.0729 88.2282C76.5775 88.0059 77.1335 87.927 77.68 88C81.2 88.47 89.53 90.17 90.36 90.34C93.36 90.07 102.61 89.89 104.12 89.86C105.12 88.79 111.21 82.55 115.85 82.52C116.112 82.5189 116.372 82.5736 116.612 82.6805C116.851 82.7874 117.065 82.944 117.24 83.14C119 85 119 91 118.92 92.21C120.295 93.9595 121.218 96.0199 121.61 98.21C122.49 102.33 122.4 122.88 122.4 123.75C122.4 123.872 122.351 123.989 122.265 124.075C122.179 124.162 122.062 124.21 121.94 124.21ZM82.09 123.29H121.48C121.48 120.17 121.48 102.09 120.71 98.41C120.36 96.3152 119.47 94.3475 118.13 92.7C118.085 92.6553 118.05 92.6023 118.026 92.544C118.002 92.4856 117.99 92.4231 117.99 92.36C118.08 90.46 117.99 85.2 116.57 83.75C116.48 83.6471 116.369 83.5638 116.245 83.5053C116.121 83.4468 115.987 83.4144 115.85 83.41C111.29 83.41 104.73 90.53 104.67 90.6C104.581 90.6873 104.464 90.7404 104.34 90.75C104.23 90.75 93.46 90.95 90.34 91.23H90.2C90.11 91.23 81.2 89.37 77.51 88.88C77.1172 88.8495 76.7236 88.9264 76.3712 89.1026C76.0189 89.2788 75.7212 89.5475 75.51 89.88C73.94 91.88 73.44 96.4 74.21 98.5C74.98 100.6 80.49 102.03 82.53 102.36C82.643 102.377 82.7456 102.436 82.8177 102.525C82.8898 102.613 82.9262 102.726 82.92 102.84C82.93 102.92 82.12 115.26 82.09 123.29Z"
                                                          fill="#333333"></path>
                                                    <path d="M90.34 91.2401H90.24L87.24 90.6401C87.1612 90.6235 87.0878 90.5873 87.0266 90.5349C86.9655 90.4824 86.9185 90.4154 86.89 90.3401C86.8643 90.2638 86.8591 90.182 86.8749 90.1031C86.8907 90.0241 86.9269 89.9507 86.98 89.8901C87.62 89.1401 93.36 82.5301 96.48 82.5001C96.7698 82.4974 97.0567 82.5577 97.3209 82.6768C97.5851 82.796 97.8202 82.9711 98.01 83.1901C99.71 85.0401 99.23 90.2501 99.21 90.4701C99.2002 90.5807 99.1498 90.6837 99.0686 90.7594C98.9874 90.8351 98.881 90.8781 98.77 90.8801L90.28 91.2501L90.34 91.2401ZM88.24 89.8801L90.37 90.3101L98.37 89.9701C98.48 88.3401 98.46 84.9701 97.37 83.8001C97.2631 83.6745 97.1295 83.5744 96.979 83.5069C96.8285 83.4395 96.6649 83.4064 96.5 83.4101C94.44 83.4301 90.24 87.6501 88.24 89.8801Z" fill="#333333"></path>
                                                    <path d="M107 95.81L101 95.3C100.879 95.2874 100.767 95.2282 100.689 95.1349C100.611 95.0416 100.572 94.9216 100.58 94.8C100.584 94.74 100.6 94.6813 100.626 94.6274C100.653 94.5736 100.691 94.5257 100.736 94.4865C100.782 94.4474 100.835 94.4178 100.892 94.3995C100.95 94.3812 101.01 94.3746 101.07 94.38L107.07 94.89C107.192 94.89 107.309 94.9385 107.395 95.0248C107.482 95.111 107.53 95.228 107.53 95.35C107.53 95.472 107.482 95.589 107.395 95.6753C107.309 95.7616 107.192 95.81 107.07 95.81H107Z" fill="#333333"></path>
                                                    <path d="M102 94.9199C102 94.9199 101.52 97.6299 103.79 97.6299C104.093 97.6352 104.394 97.5802 104.675 97.468C104.956 97.3558 105.212 97.1887 105.428 96.9764C105.644 96.7642 105.816 96.511 105.933 96.2318C106.05 95.9525 106.11 95.6527 106.11 95.3499L102 94.9199Z" fill="#333333"></path>
                                                    <path d="M98 121C95.2944 121.29 92.5656 121.29 89.86 121C89.3913 120.997 88.9427 120.81 88.6113 120.479C88.2799 120.147 88.0926 119.699 88.09 119.23V110C88.0926 109.531 88.2799 109.083 88.6113 108.751C88.9427 108.42 89.3913 108.233 89.86 108.23C92.5627 107.89 95.2973 107.89 98 108.23C98.2354 108.226 98.4693 108.269 98.688 108.356C98.9068 108.443 99.1062 108.573 99.2745 108.737C99.4429 108.902 99.5769 109.098 99.6688 109.315C99.7607 109.532 99.8087 109.765 99.81 110V119.27C99.7969 119.739 99.5994 120.183 99.2606 120.507C98.9217 120.831 98.4687 121.008 98 121Z" fill="white"></path>
                                                    <path d="M99.3599 121C98.6858 121.251 97.9441 121.251 97.2699 121C97.0199 121 96.8199 120.3 96.8199 119.45V111.34C96.8199 110.49 97.0199 109.79 97.2699 109.79C97.5984 109.642 97.9546 109.565 98.3149 109.565C98.6753 109.565 99.0315 109.642 99.3599 109.79C99.5999 109.79 99.8099 110.49 99.8099 111.34V119.45C99.8099 120.33 99.5999 121 99.3599 121Z" fill="#DCDCDC"></path>
                                                    <path d="M100.2 116.19H101.2C101.311 116.187 101.416 116.142 101.494 116.064C101.572 115.986 101.617 115.88 101.62 115.77V113.62C101.62 113.509 101.576 113.402 101.497 113.323C101.418 113.244 101.311 113.2 101.2 113.2H100.14V111.14H101.14C101.799 111.14 102.43 111.401 102.897 111.866C103.364 112.33 103.627 112.961 103.63 113.62V115.77C103.627 116.429 103.364 117.059 102.897 117.524C102.43 117.989 101.799 118.25 101.14 118.25H100.08L100.2 116.19Z" fill="white"></path>
                                                    <path d="M101.37 111.22V113.23H100.16V111.14L101.37 111.22Z" fill="#DCDCDC"></path>
                                                    <path d="M101.37 116.25V118.25H100.16V116.16L101.37 116.25Z" fill="#DCDCDC"></path>
                                                    <path d="M94 121.68C92.6304 121.677 91.262 121.603 89.9 121.46C89.3146 121.45 88.7565 121.21 88.3453 120.794C87.9341 120.377 87.7025 119.816 87.7 119.23V110C87.6999 109.415 87.9311 108.853 88.3431 108.437C88.7551 108.022 89.3146 107.785 89.9 107.78C92.6221 107.43 95.3778 107.43 98.1 107.78C98.6853 107.785 99.2448 108.022 99.6568 108.437C100.069 108.853 100.3 109.415 100.3 110V119.27C100.297 119.856 100.066 120.417 99.6546 120.834C99.2434 121.25 98.6854 121.49 98.1 121.5C96.7373 121.63 95.3688 121.69 94 121.68ZM94 108.4C92.6627 108.399 91.3267 108.482 90 108.65H89.9C89.5542 108.65 89.2226 108.787 88.9772 109.03C88.7318 109.274 88.5926 109.604 88.59 109.95V119.22C88.59 119.568 88.728 119.901 88.9736 120.146C89.2193 120.392 89.5525 120.53 89.9 120.53C92.5589 120.817 95.241 120.817 97.9 120.53H98C98.3474 120.53 98.6806 120.392 98.9263 120.146C99.1719 119.901 99.31 119.568 99.31 119.22V110C99.3073 109.654 99.1681 109.324 98.9227 109.08C98.6774 108.837 98.3457 108.7 98 108.7C96.6743 108.516 95.3383 108.415 94 108.4Z"
                                                          fill="#333333"></path>
                                                    <path d="M101.22 118.71H100.16C100.036 118.709 99.9172 118.658 99.8301 118.57C99.7876 118.526 99.7543 118.475 99.732 118.418C99.7097 118.361 99.6988 118.301 99.7 118.24V116.18C99.7027 116.06 99.7523 115.945 99.8383 115.861C99.9243 115.777 100.04 115.73 100.16 115.73H101.16V113.66H100.16C100.036 113.659 99.9172 113.608 99.8301 113.52C99.747 113.43 99.7007 113.312 99.7 113.19V111.13C99.7027 111.01 99.7523 110.895 99.8383 110.811C99.9243 110.727 100.04 110.68 100.16 110.68H101.16C101.945 110.68 102.7 110.988 103.26 111.537C103.821 112.087 104.144 112.835 104.16 113.62V115.77C104.145 116.545 103.83 117.284 103.282 117.832C102.734 118.38 101.995 118.695 101.22 118.71ZM100.63 117.79H101.22C101.75 117.79 102.259 117.579 102.634 117.204C103.009 116.829 103.22 116.32 103.22 115.79V113.64C103.22 113.109 103.009 112.601 102.634 112.226C102.259 111.851 101.75 111.64 101.22 111.64H100.64V112.78H101.23C101.346 112.779 101.461 112.8 101.568 112.844C101.676 112.888 101.773 112.953 101.855 113.035C101.937 113.117 102.002 113.214 102.046 113.322C102.09 113.429 102.111 113.544 102.11 113.66V115.81C102.11 116.043 102.017 116.267 101.852 116.432C101.687 116.597 101.463 116.69 101.23 116.69H100.66L100.63 117.79Z"
                                                          fill="#333333"></path>
                                                    <path d="M90.6399 112.5C91.1646 112.5 91.5899 112.075 91.5899 111.55C91.5899 111.025 91.1646 110.6 90.6399 110.6C90.1153 110.6 89.6899 111.025 89.6899 111.55C89.6899 112.075 90.1153 112.5 90.6399 112.5Z" fill="#333333"></path>
                                                    <path d="M97.09 112.5C97.6147 112.5 98.04 112.075 98.04 111.55C98.04 111.025 97.6147 110.6 97.09 110.6C96.5653 110.6 96.14 111.025 96.14 111.55C96.14 112.075 96.5653 112.5 97.09 112.5Z" fill="#333333"></path>
                                                    <path d="M93.82 113.32C94.7976 113.32 95.59 112.528 95.59 111.55C95.59 110.572 94.7976 109.78 93.82 109.78C92.8425 109.78 92.05 110.572 92.05 111.55C92.05 112.528 92.8425 113.32 93.82 113.32Z" fill="#333333"></path>
                                                    <path d="M83.39 89.41C81.22 89 79.03 88.61 77.61 88.41C73.9 87.92 72.72 95.65 73.8 98.58C74.51 100.51 78.02 101.7 80.36 102.29C84.86 97.45 83.39 89.41 83.39 89.41Z" fill="#333333"></path>
                                                    <path d="M79 100.63L80 100.84C80.2616 100.555 80.4533 100.212 80.56 99.8401C80.3943 100.099 80.1623 100.309 79.8879 100.448C79.6135 100.587 79.3069 100.65 79 100.63Z" fill="white"></path>
                                                    <path d="M76 90.6199C76.4599 90.6996 76.924 90.753 77.39 90.7799L77.58 89.6799C77.2644 89.7134 76.9598 89.8147 76.6871 89.977C76.4144 90.1392 76.18 90.3586 76 90.6199Z" fill="white"></path>
                                                    <path d="M75.54 97.35L76.38 97.63L76.97 96.71L75.54 97.35Z" fill="white"></path>
                                                    <path d="M110.75 119.93C107.95 119.93 105.14 117.59 104.81 117.31C104.659 117.179 104.535 117.019 104.446 116.84C104.357 116.661 104.304 116.466 104.29 116.266C104.276 116.066 104.301 115.866 104.365 115.676C104.428 115.486 104.529 115.311 104.66 115.16C104.791 115.009 104.951 114.885 105.13 114.796C105.309 114.707 105.504 114.654 105.704 114.64C105.904 114.626 106.104 114.651 106.294 114.715C106.484 114.778 106.659 114.879 106.81 115.01C107.81 115.81 109.74 117.01 111 116.88C111.179 116.861 111.351 116.801 111.503 116.706C111.656 116.611 111.784 116.482 111.88 116.33C112.364 115.604 112.637 114.758 112.668 113.886C112.7 113.013 112.49 112.15 112.06 111.39C111.857 111.044 111.797 110.633 111.895 110.244C111.992 109.855 112.238 109.519 112.58 109.31C112.921 109.103 113.33 109.039 113.718 109.133C114.106 109.227 114.441 109.47 114.65 109.81C115.388 111.076 115.751 112.525 115.698 113.989C115.645 115.452 115.177 116.871 114.35 118.08C114.01 118.581 113.566 119.003 113.049 119.318C112.531 119.632 111.952 119.83 111.35 119.9C111.151 119.921 110.95 119.931 110.75 119.93Z"
                                                          fill="#333333"></path>
                                                    <path d="M106.41 115.41C106.192 114.835 105.824 114.33 105.343 113.946C104.863 113.563 104.289 113.315 103.68 113.23V113.92C103.68 113.92 101.26 112.86 101.13 113.63C100.83 115.53 99.78 119.48 106.19 118.25L106.41 115.41Z" fill="#333333"></path>
                                                    <path d="M101.97 73.6501L103.67 77.6601L110.2 74.5801L108 70.3301L101.97 73.6501Z" fill="#F2F2F2"></path>
                                                    <path d="M100.51 71.57C99.2307 69.6425 97.3864 68.158 95.23 67.32C91.78 66.07 86.64 59.24 95.23 54.55L96.23 58.07L99.09 58.51L98.79 62.25L101.51 62.4701L102 66L104 69.3701L100.51 71.57Z" fill="white"></path>
                                                    <path d="M105.52 51.3899L104.75 54.9999L107.05 56.7499L105.05 59.8999L107.34 61.3899L106.04 64.6899L106.24 68.6899L108.09 68.5299C108.066 66.672 108.463 64.8328 109.25 63.1499C110.51 60.3499 115.08 52.2199 105.52 51.3899Z" fill="white"></path>
                                                    <path d="M99.4799 50.8799L98.8199 53.6699L101.97 52.7599L99.4799 50.8799Z" fill="white"></path>
                                                    <path d="M101.97 59.5399L103.37 54.9099L101.03 55.3499L101.97 59.5399Z" fill="white"></path>
                                                    <path d="M103.67 78.1199C103.614 78.1294 103.556 78.1294 103.5 78.1199C103.442 78.0979 103.389 78.0644 103.344 78.0215C103.3 77.9785 103.264 77.927 103.24 77.8699L101.55 73.8699C101.506 73.7656 101.502 73.6487 101.539 73.5417C101.576 73.4347 101.651 73.3451 101.75 73.2899L107.75 69.9599C107.807 69.9352 107.868 69.9224 107.93 69.9224C107.992 69.9224 108.053 69.9352 108.11 69.9599C108.169 69.9751 108.225 70.0025 108.273 70.0403C108.321 70.0782 108.361 70.1258 108.39 70.1799L110.59 74.4399C110.635 74.5558 110.635 74.6841 110.59 74.7999C110.572 74.8584 110.543 74.9126 110.503 74.9591C110.464 75.0056 110.415 75.0433 110.36 75.0699L103.82 78.1499C103.769 78.149 103.718 78.1388 103.67 78.1199ZM102.56 73.8499L103.9 76.9999L109.57 74.3299L107.81 70.9999L102.56 73.8499Z" fill="#333333"></path>
                                                    <path d="M100.51 72H100.41C100.35 71.9867 100.293 71.9612 100.243 71.9251C100.193 71.889 100.151 71.843 100.12 71.79C98.888 69.9552 97.1266 68.539 95.07 67.73C93.7397 67.1774 92.5778 66.2853 91.7004 65.1429C90.823 64.0005 90.2608 62.6478 90.07 61.22C89.92 59.29 90.66 56.5 95 54.12C95.0613 54.0927 95.1278 54.0786 95.195 54.0786C95.2621 54.0786 95.3286 54.0927 95.39 54.12C95.4544 54.1468 95.5121 54.1877 95.5588 54.2396C95.6055 54.2914 95.6401 54.3531 95.66 54.42L96.6 57.66L99.18 58.06C99.2948 58.0773 99.3989 58.1375 99.4712 58.2284C99.5436 58.3193 99.5788 58.4342 99.57 58.55L99.31 61.83L101.57 62.01C101.675 62.0222 101.774 62.0691 101.85 62.1433C101.926 62.2175 101.975 62.3148 101.99 62.42L102.41 65.84L104.41 69.13C104.473 69.2336 104.493 69.3579 104.465 69.4759C104.437 69.5939 104.363 69.696 104.26 69.76L100.76 72C100.678 72.0236 100.592 72.0236 100.51 72ZM95 55.24C92.24 56.88 90.88 58.92 91 61.17C91.1783 62.4177 91.675 63.5985 92.4422 64.5986C93.2093 65.5987 94.2211 66.3844 95.38 66.88C97.4982 67.7098 99.3269 69.1422 100.64 71L103.4 69.27L101.58 66.27C101.545 66.2124 101.524 66.1472 101.52 66.08L101.13 62.93L98.78 62.74C98.6597 62.7298 98.5482 62.6727 98.4696 62.581C98.391 62.4893 98.3517 62.3705 98.36 62.25L98.62 58.93L96.19 58.56C96.1023 58.5456 96.0203 58.5071 95.9532 58.4488C95.8861 58.3905 95.8365 58.3148 95.81 58.23L95 55.24Z"
                                                          fill="#333333"></path>
                                                    <path d="M106.2 69.07C106.09 69.0733 105.982 69.0339 105.9 68.96C105.808 68.8773 105.751 68.7631 105.74 68.64L105.54 64.64C105.53 64.5771 105.53 64.5129 105.54 64.45L106.7 61.45L104.7 60.17C104.6 60.1009 104.53 59.9964 104.504 59.8776C104.478 59.7588 104.498 59.6346 104.56 59.53L106.37 56.74L104.37 55.25C104.301 55.1972 104.249 55.126 104.219 55.0446C104.189 54.9632 104.182 54.8749 104.2 54.79L104.97 51.2C104.992 51.0896 105.054 50.9914 105.145 50.9248C105.236 50.8581 105.348 50.8279 105.46 50.84C108.36 51.09 110.3 52.04 111.21 53.66C112.81 56.5 110.83 60.53 109.76 62.66L109.52 63.14C108.772 64.7563 108.392 66.519 108.41 68.3C108.416 68.4188 108.375 68.5352 108.297 68.6246C108.218 68.7141 108.108 68.7698 107.99 68.78L106.15 68.95L106.2 69.07ZM106.46 64.74L106.64 68.11L107.58 68.03C107.625 66.2452 108.037 64.4887 108.79 62.87C108.87 62.72 108.95 62.55 109.03 62.38C110.03 60.38 111.87 56.62 110.51 54.2C109.79 52.93 108.24 52.2 105.88 51.88L105.26 54.78L107.33 56.36C107.423 56.4282 107.486 56.5296 107.507 56.6431C107.527 56.7566 107.503 56.8736 107.44 56.97L105.65 59.74L107.55 60.97C107.637 61.0304 107.702 61.1186 107.733 61.2203C107.764 61.322 107.759 61.4312 107.72 61.53L106.46 64.74Z"
                                                          fill="#333333"></path>
                                                    <path d="M98.82 54.1299C98.7009 54.1278 98.5869 54.0814 98.5 53.9999C98.4448 53.9423 98.4042 53.8722 98.3816 53.7957C98.359 53.7191 98.355 53.6383 98.37 53.5599L99 50.7699C99.0158 50.6957 99.051 50.627 99.1019 50.5708C99.1529 50.5146 99.2178 50.4729 99.29 50.4499C99.3608 50.4219 99.4376 50.4127 99.5129 50.4232C99.5883 50.4337 99.6597 50.4636 99.72 50.5099L102.21 52.3899C102.279 52.4431 102.332 52.5139 102.364 52.595C102.395 52.676 102.405 52.7641 102.39 52.8499C102.374 52.9335 102.334 53.0107 102.276 53.0727C102.217 53.1346 102.143 53.1788 102.06 53.1999L99 54.1099L98.82 54.1299ZM99.82 51.6699L99.45 52.9999L100.96 52.5599L99.82 51.6699Z" fill="#333333"></path>
                                                    <path d="M102 60.0001C101.898 59.9947 101.8 59.957 101.721 59.8922C101.642 59.8274 101.585 59.7391 101.56 59.6401L100.62 55.4601C100.604 55.3992 100.601 55.3357 100.612 55.2737C100.622 55.2117 100.645 55.1525 100.68 55.1001C100.753 54.9997 100.859 54.9288 100.98 54.9001L103.33 54.4601C103.408 54.4462 103.488 54.4525 103.562 54.4786C103.637 54.5046 103.704 54.5494 103.756 54.6087C103.808 54.668 103.844 54.7398 103.861 54.8171C103.877 54.8944 103.874 54.9746 103.85 55.0501L102.45 59.6701C102.425 59.7686 102.366 59.8554 102.284 59.9155C102.202 59.9757 102.102 60.0056 102 60.0001ZM101.61 55.7201L102.07 57.7201L102.74 55.4901L101.61 55.7201Z" fill="#333333"></path>
                                                    <path d="M101.54 69.0699C101.459 69.0702 101.379 69.0491 101.309 69.0087C101.239 68.9683 101.18 68.9101 101.14 68.8399C100.536 67.6437 99.7647 66.5394 98.85 65.5599C98.54 65.2999 98.44 65.3299 98.1 65.4499C97.7945 65.5868 97.4595 65.6447 97.1258 65.6185C96.7921 65.5923 96.4704 65.4828 96.19 65.2999C95.6421 65.0371 95.1958 64.6014 94.92 64.0599H94.63C94.3575 64.1426 94.066 64.1389 93.7957 64.0494C93.5253 63.9598 93.2893 63.7889 93.12 63.5599C92.95 63.2899 92.53 62.2199 94.18 59.7099C94.2133 59.6592 94.2563 59.6155 94.3066 59.5815C94.3569 59.5475 94.4134 59.5237 94.4729 59.5116C94.5324 59.4996 94.5937 59.4994 94.6533 59.5111C94.7128 59.5228 94.7695 59.5462 94.82 59.5799C94.8704 59.6123 94.9138 59.6544 94.9477 59.7038C94.9817 59.7532 95.0054 59.8089 95.0175 59.8676C95.0296 59.9263 95.0298 59.9868 95.0182 60.0456C95.0067 60.1044 94.9834 60.1602 94.95 60.2099C94.26 61.2099 93.66 62.6899 93.95 63.0699C94.01 63.1599 94.24 63.1999 94.55 63.1499H94.8C94.7952 63.0934 94.7952 63.0365 94.8 62.9799C94.8955 62.4786 95.1358 62.0163 95.4913 61.6502C95.8467 61.2841 96.3017 61.0302 96.8 60.9199C96.9728 60.8656 97.1571 60.8593 97.3332 60.9015C97.5093 60.9438 97.6707 61.0331 97.8 61.1599C97.9046 61.2888 97.9697 61.4451 97.9875 61.6101C98.0052 61.7752 97.9748 61.9418 97.9 62.0899C97.4863 62.9025 96.7669 63.5175 95.9 63.7999C96.1018 64.0959 96.3776 64.3338 96.7 64.4899C96.8725 64.6047 97.0716 64.6733 97.2782 64.689C97.4848 64.7048 97.692 64.6672 97.88 64.5799C99.01 64.1899 99.74 64.4299 102.02 68.3799C102.06 68.45 102.082 68.5294 102.082 68.6103C102.082 68.6912 102.06 68.7707 102.02 68.8406C101.979 68.9106 101.921 68.9687 101.851 69.0089C101.78 69.0492 101.701 69.0702 101.62 69.0699H101.54ZM96.93 61.8199C96.6725 61.8857 96.4338 62.0102 96.2325 62.1837C96.0313 62.3572 95.8729 62.575 95.77 62.8199C96.2493 62.6122 96.6539 62.2634 96.93 61.8199Z"
                                                          fill="#333333"></path>
                                                </svg>
                                            </div>
                                            <div class="css-1lvgb89">还没有评论，发表第一个评论吧</div>
                                        </div>
                                        <div class="css-1vjm6vs"></div>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                    <div class="PostIndex-Contributions" data-za-detail-view-path-module="ColumnList" data-za-detail-view-path-module_name="文章被以下专栏收录" data-za-extra-module="{}"><h3 class="BlockTitle">文章被以下专栏收录</h3>
                        <ul>
                            <div class="ContentItem Column-ColumnItem">
                                <div class="ContentItem-main">
                                    <div class="ContentItem-image"><a class="ColumnLink" href="https://www.zhihu.com/column/c_1101164296519720960">
                                        <div class="css-1gomreu"><img alt="JAVA CTO之旅" class="Avatar css-1u7r5c9" src="./mybatis 3.x源码深度解析（五） - 知乎_files/4b70deef7_l.jpg" srcset="https://pica.zhimg.com/4b70deef7_l.jpg?source=172ae18b 2x"></div>
                                    </a></div>
                                    <div class="ContentItem-head">
                                        <h2 class="ContentItem-title"><span><a class="ColumnLink ColumnItem-Title" href="https://www.zhihu.com/column/c_1101164296519720960"><div class="css-1gomreu">JAVA CTO之旅</div></a></span></h2>
                                    </div>
                                </div>
                            </div>
                        </ul>
                    </div>
                    <div aria-label="推荐阅读" class="Recommendations-Main" role="complementary" style="width: 1519px;"><h3 class="BlockTitle Recommendations-BlockTitle">推荐阅读</h3>
                        <ul class="Recommendations-List">
                            <button class="PagingButton PagingButton-Previous" data-za-detail-view-path-module="Unknown" data-za-detail-view-path-module_name="推荐阅读" data-za-extra-module="{}" disabled="">
                                <svg class="Zi Zi--ArrowLeft" fill="#d3d3d3" height="40" viewBox="0 0 24 24" width="40">
                                    <path clip-rule="evenodd" d="m10.752 12 4.025-3.78a.684.684 0 0 0 0-1.01.796.796 0 0 0-1.075 0l-4.42 4.15a.866.866 0 0 0 0 1.28l4.42 4.15a.796.796 0 0 0 1.075 0 .684.684 0 0 0 0-1.01L10.752 12Z" fill-rule="evenodd"></path>
                                </svg>
                            </button>
                            <a class="PostItem" href="https://zhuanlan.zhihu.com/p/66796986">
                                <div><h1 class="PostItem-Title">mybatis 3.x源码深度解析（三）</h1>
                                    <p class="PostItem-Summary">2.2 mapper加载与初始化 前面说过mybatis mapper文件的加载主要有两大类，通过package加载和明确指定的方式。 一般来说，对于简单语句来说，使用注解代码会更加清晰，然而Java注解对于复杂…</p>
                                    <div class="PostItem-Footer"><span>永恒之魂</span><span class="PostItem-FooterTitle">发表于JAVA ...</span></div>
                                </div>
                            </a><a class="PostItem" href="https://zhuanlan.zhihu.com/p/67324219">
                            <div><img alt="mybatis 3.x源码深度解析（八）" class="PostItem-TitleImage" src="./mybatis 3.x源码深度解析（五） - 知乎_files/v2-a62228cf2dc5e52ad40f3db16ac670bb_250x0.jpg" srcset="https://pic1.zhimg.com/v2-a62228cf2dc5e52ad40f3db16ac670bb_qhd.jpg?source=172ae18b 2x">
                                <h1 class="PostItem-Title">mybatis 3.x源码深度解析（八）</h1>
                                <div class="PostItem-Footer"><span>永恒之魂</span><span class="PostItem-FooterTitle">发表于JAVA ...</span></div>
                            </div>
                        </a><a class="PostItem" href="https://zhuanlan.zhihu.com/p/66543158">
                            <div><img alt="(转）mybatis 3.x源码深度解析（一）" class="PostItem-TitleImage" src="./mybatis 3.x源码深度解析（五） - 知乎_files/v2-a5068d837ba09a7297f10f8185c654d4_250x0.jpg" srcset="https://pic1.zhimg.com/v2-a5068d837ba09a7297f10f8185c654d4_qhd.jpg?source=172ae18b 2x">
                                <h1 class="PostItem-Title">(转）mybatis 3.x源码深度解析（一）</h1>
                                <div class="PostItem-Footer"><span>永恒之魂</span><span class="PostItem-FooterTitle">发表于JAVA ...</span></div>
                            </div>
                        </a><a class="PostItem" href="https://zhuanlan.zhihu.com/p/470371545">
                            <div><h1 class="PostItem-Title">Mybatis源码解析视频，手把手带你实践</h1>
                                <p class="PostItem-Summary">mybatis在开发中作为一个ORM框架使用的比较多，所谓ORM指的是Object Relation Mapping，直译过来就是对象关系映射，这个映射指的是java中的对象和数据库中的记录的映射，也就是一个java对象…</p>
                                <div class="PostItem-Footer"><span>余温</span><span class="PostItem-FooterTitle"></span></div>
                            </div>
                        </a>
                            <button class="PagingButton PagingButton-Next" data-za-detail-view-path-module="Unknown" data-za-detail-view-path-module_name="推荐阅读" data-za-extra-module="{}">
                                <svg class="Zi Zi--ArrowRight" fill="#d3d3d3" height="40" viewBox="0 0 24 24" width="40">
                                    <path clip-rule="evenodd" d="m13.248 12-4.025 3.78a.684.684 0 0 0 0 1.01.796.796 0 0 0 1.075 0l4.42-4.15a.867.867 0 0 0 0-1.28l-4.42-4.15a.796.796 0 0 0-1.075 0 .684.684 0 0 0 0 1.01L13.248 12Z" fill-rule="evenodd"></path>
                                </svg>
                            </button>
                        </ul>
                    </div>
                </div>
            </div>
        </main>
        <div role="complementary">
            <div class="CornerButtons">
                <div class="CornerAnimayedFlex">
                    <button aria-label="回到顶部" class="Button CornerButton Button--plain css-89d6kn" data-tooltip="回到顶部" data-tooltip-position="left" data-tooltip-will-hide-on-click="true" type="button">
                        <svg aria-hidden="true" class="Zi Zi--BackToTop" fill="currentColor" height="24" viewBox="0 0 24 24" width="24">
                            <path clip-rule="evenodd" d="M13.204 3.107a1.75 1.75 0 0 0-2.408 0L3.806 9.73c-1.148 1.088-.378 3.02 1.204 3.02h2.24V20c0 .966.784 1.75 1.75 1.75h6A1.75 1.75 0 0 0 16.75 20v-7.25h2.24c1.582 0 2.353-1.932 1.204-3.02l-6.99-6.623Z" fill-rule="evenodd"></path>
                        </svg>
                    </button>
                </div>
            </div>
        </div>
    </div>
</div>
<script id="js-clientConfig" type="text/json">
    {"fetchRoot":{"www":"https:\u002F\u002Fwww.zhihu.com","api":"https:\u002F\u002Fapi.zhihu.com","lens":"https:\u002F\u002Flens.zhihu.com","zhuanlan":"https:\u002F\u002Fzhuanlan.zhihu.com\u002Fapi\u002F","walletpay":"https:\u002F\u002Fwalletpay.zhihu.com","captcha":"https:\u002F\u002Fcaptcha.zhihu.com","vzuu":"https:\u002F\u002Fv.vzuu.com","openapi":"https:\u002F\u002Fopenapi.zhihu.com","svip":"https:\u002F\u002Fsvip.zhihu.com"},"host":"zhihu.com","protocol":"https:","wwwHost":"www.zhihu.com","videoHost":"video.zhihu.com","zhuanlanHost":"zhuanlan.zhihu.com","allowSignUp":true,"refreshValidityPeriod":"30","release":"1099-007593d0","currentEntry":"column","isMobileEntry":false,"apollo":{"env":"prod","globalSilence":"","ncgModeSign":"3f8e56febda4fb3bbea72e379d76de1e","topstory_rec_adp":"1","topstory_hot_adp":"1","editor_adapt_native":"0","content_publish_pin":"1","content_publish_answer":"1","content_publish_question":"0","test_canary":"member|0-100,1-0","use_new_player":"member|0-100,1-0","player_vendor":"member|0-100,1-0,2-0","use_hevc":"member|0-0,1-100","upload_use_signature":"member|0-0,1-100","use_backdrop_blur":"member|0-0,1-100","article_title_imagex":"member|0-0,1-100","play_station":"member|0-0,1-100","use_cached_supported_countries":"device|1-100,0-0","contentItem_cover_imagex":"member|0-0,1-100","use_qrcode_login_v2":"device|1-100,0-0","content_publish_article":"0"}}

</script>
<script id="js-initialData" type="text/json">
    {"initialState":{"common":{"ask":{},"cities":{"cityData":[]}},"loading":{"global":{"count":0},"local":{"env\u002FgetIpinfo\u002F":false,"article\u002Fget\u002F":false,"brand\u002FgetUrl\u002F":false,"article\u002FloadPostSearchEntity\u002F":false}},"entities":{"users":{"yong-heng-zhi-hun":{"isFollowed":false,"avatarUrlTemplate":"https:\u002F\u002Fpicx.zhimg.com\u002Fv2-2856788095527eadbbc0dd5d521840f0.jpg?source=172ae18b","uid":"1065361307078983680","userType":"people","isFollowing":false,"urlToken":"yong-heng-zhi-hun","id":"f5930745493d322ed5f4c7af691e5e8d","description":"注重底层，第一性原理思考。","name":"永恒之魂","isAdvertiser":false,"headline":"道可道，非常道。","gender":1,"url":"\u002Fpeople\u002Ff5930745493d322ed5f4c7af691e5e8d","avatarUrl":"https:\u002F\u002Fpic1.zhimg.com\u002Fv2-2856788095527eadbbc0dd5d521840f0_l.jpg?source=172ae18b","isOrg":false,"type":"people","badge":[],"badgeV2":{"title":"","mergedBadges":[],"detailBadges":[],"icon":"","nightIcon":""},"exposedMedal":{"medalId":"972477022068568064","medalName":"备受瞩目","avatarUrl":"https:\u002F\u002Fpic1.zhimg.com\u002Fv2-6da117205088242db9cd82e48b28640d_r.png?source=172ae18b","miniAvatarUrl":"https:\u002F\u002Fpic1.zhimg.com\u002Fv2-6da117205088242db9cd82e48b28640d_l.png?source=172ae18b","description":"被 1000 个人关注","medalAvatarFrame":""}}},"questions":{},"answers":{},"articles":{"66984738":{"trackUrl":["https:\u002F\u002Fsugar.zhihu.com\u002Fplutus_adreaper\u002Fcontent_monitor_log?si=__SESSIONID__&ti=__ATOKEN__&at=view&pf=__OS__&ed=BiBUKF0xBSkqGGJ-QhvjYHlDBQ==&idfa=__IDFA__&imei=__IMEI__&androidid=__ANDROIDID__&oaid=__OAID__&ci=__CREATIVEID__&zid=__ZONEID__"],"id":66984738,"title":"mybatis 3.x源码深度解析（五）","type":"article","articleType":"normal","excerptTitle":"","url":"https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F66984738","imageUrl":"","titleImage":"","excerpt":"\u003Cimg src=\"https:\u002F\u002Fpic2.zhimg.com\u002Fv2-a7dd0ded5858b60b8c73c3805ebf43ed_200x112.png\" data-caption=\"\" data-size=\"normal\" data-rawwidth=\"582\" data-rawheight=\"149\" data-watermark=\"watermark\" data-original-src=\"v2-a7dd0ded5858b60b8c73c3805ebf43ed\" data-watermark-src=\"v2-8f59bd34e1262ea50cdec8b60bc401bd\" data-private-watermark-src=\"\" class=\"origin_image inline-img zh-lightbox-thumb\" data-original=\"https:\u002F\u002Fpic2.zhimg.com\u002Fv2-a7dd0ded5858b60b8c73c3805ebf43ed_r.png\"\u002F\u003E\u003Cb\u003E3 关键对象总结与回顾\u003C\u002Fb\u003E\u003Cb\u003E3.1 SqlSource\u003C\u002Fb\u003ESqlSource是XML文件或者注解方法中映射语句的实现时表示，通过SqlSourceBuilder.parse()方法创建，SqlSourceBuilder中符号解析器将mybatis中的查询参数#{}转换为?，并记录了参数的顺序。它只有一个方法getBoundSql用于获…","created":1558777139,"updated":1558777241,"author":{"isFollowed":false,"avatarUrlTemplate":"https:\u002F\u002Fpicx.zhimg.com\u002Fv2-2856788095527eadbbc0dd5d521840f0.jpg?source=172ae18b","uid":"1065361307078983680","userType":"people","isFollowing":false,"urlToken":"yong-heng-zhi-hun","id":"f5930745493d322ed5f4c7af691e5e8d","description":"注重底层，第一性原理思考。","name":"永恒之魂","isAdvertiser":false,"headline":"道可道，非常道。","gender":1,"url":"\u002Fpeople\u002Ff5930745493d322ed5f4c7af691e5e8d","avatarUrl":"https:\u002F\u002Fpic1.zhimg.com\u002Fv2-2856788095527eadbbc0dd5d521840f0_l.jpg?source=172ae18b","isOrg":false,"type":"people","badge":[],"badgeV2":{"title":"","mergedBadges":[],"detailBadges":[],"icon":"","nightIcon":""},"exposedMedal":{"medalId":"972477022068568064","medalName":"备受瞩目","avatarUrl":"https:\u002F\u002Fpic1.zhimg.com\u002Fv2-6da117205088242db9cd82e48b28640d_r.png?source=172ae18b","miniAvatarUrl":"https:\u002F\u002Fpic1.zhimg.com\u002Fv2-6da117205088242db9cd82e48b28640d_l.png?source=172ae18b","description":"被 1000 个人关注","medalAvatarFrame":""}},"commentPermission":"all","copyrightPermission":"need_review","state":"published","ipInfo":"","imageWidth":0,"imageHeight":0,"content":"\u003Ch2\u003E\u003Cb\u003E3 关键对象总结与回顾\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Ch3\u003E\u003Cb\u003E3.1 SqlSource\u003C\u002Fb\u003E\u003C\u002Fh3\u003E\u003Cp data-pid=\"AcXZE7K1\"\u003ESqlSource是XML文件或者注解方法中映射语句的实现时表示，通过SqlSourceBuilder.parse()方法创建，SqlSourceBuilder中符号解析器将mybatis中的查询参数#{}转换为?，并记录了参数的顺序。它只有一个方法getBoundSql用于获取映射语句对象的各个组成部分，它的定义如下：\u003C\u002Fp\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003E\u002F**\n * Represents the content of a mapped statement read from an XML file or an annotation. \n * It creates the SQL that will be passed to the database out of the input parameter received from the user.\n * 代表从XML文件或者注解读取的映射语句的内容,它创建的SQL会被传递给数据库。\n * @author Clinton Begin\n *\u002F\npublic interface SqlSource {\n\n  BoundSql getBoundSql(Object parameterObject);\n\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp data-pid=\"MM_ymqyT\"\u003E根据SQL语句的类型不同，mybatis提供了多种SqlSource的具体实现，如下所示：\u003Cbr\u002F\u003E\u003C\u002Fp\u003E\u003Cfigure data-size=\"normal\"\u003E\u003Cnoscript\u003E\u003Cimg src=\"https:\u002F\u002Fpic2.zhimg.com\u002Fv2-8f59bd34e1262ea50cdec8b60bc401bd_b.jpg\" data-caption=\"\" data-size=\"normal\" data-rawwidth=\"582\" data-rawheight=\"149\" class=\"origin_image zh-lightbox-thumb\" width=\"582\" data-original=\"https:\u002F\u002Fpic2.zhimg.com\u002Fv2-8f59bd34e1262ea50cdec8b60bc401bd_r.jpg\"\u002F\u003E\u003C\u002Fnoscript\u003E\u003Cimg src=\"data:image\u002Fsvg+xml;utf8,&lt;svg xmlns=&#39;http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg&#39; width=&#39;582&#39; height=&#39;149&#39;&gt;&lt;\u002Fsvg&gt;\" data-caption=\"\" data-size=\"normal\" data-rawwidth=\"582\" data-rawheight=\"149\" class=\"origin_image zh-lightbox-thumb lazy\" width=\"582\" data-original=\"https:\u002F\u002Fpic2.zhimg.com\u002Fv2-8f59bd34e1262ea50cdec8b60bc401bd_r.jpg\" data-actualsrc=\"https:\u002F\u002Fpic2.zhimg.com\u002Fv2-8f59bd34e1262ea50cdec8b60bc401bd_b.jpg\" data-original-token=\"v2-a7dd0ded5858b60b8c73c3805ebf43ed\"\u002F\u003E\u003C\u002Ffigure\u003E\u003Cp class=\"ztext-empty-paragraph\"\u003E\u003Cbr\u002F\u003E\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli data-pid=\"UYLdBZ2o\"\u003EStaticSqlSource：最终静态SQL语句的封装,其他类型的SqlSource最终都委托给StaticSqlSource。\u003C\u002Fli\u003E\u003Cli data-pid=\"1htzClrp\"\u003ERawSqlSource：原始静态SQL语句的封装,在加载时就已经确定了SQL语句,没有、等动态标签和${} SQL拼接,比动态SQL语句要快,因为不需要运行时解析SQL节点。\u003C\u002Fli\u003E\u003Cli data-pid=\"RoBbaEOV\"\u003EDynamicSqlSource：动态SQL语句的封装，在运行时需要根据参数处理、等标签或者${} SQL拼接之后才能生成最后要执行的静态SQL语句。\u003C\u002Fli\u003E\u003Cli data-pid=\"rS9H-3Bj\"\u003EProviderSqlSource：当SQL语句通过指定的类和方法获取时(使用@XXXProvider注解)，需要使用本类，它会通过反射调用相应的方法得到SQL语句。\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Ch3\u003E\u003Cb\u003E3.2 SqlNode\u003C\u002Fb\u003E\u003C\u002Fh3\u003E\u003Cp data-pid=\"_06kie6Q\"\u003E　　SqlNode接口主要用来处理CRUD节点下的各类动态标签比如、，对每个动态标签，mybatis都提供了对应的SqlNode实现，这些动态标签可以相互嵌套且实现上采用单向链表进行应用，这样后面如果需要增加其他动态标签，就只需要新增对应的SqlNode实现就能支持。mybatis使用OGNL表达式语言。对sqlNode的调用在SQL执行期间的DynamicSqlSource.getBoundSql()方法中，SQL执行过程我们后面会讲解。\u003Cbr\u002F\u003E　　当前版本的SqlNode有下列实现：\u003Cbr\u002F\u003E　　其中MixedSqlNode代表了所有具体SqlNode的集合，其他分别代表了一种类型的SqlNode。下面对每个SqlNode的实现做简单的分析：\u003C\u002Fp\u003E\u003Ch3\u003E\u003Cb\u003EChooseSqlNode\u003C\u002Fb\u003E\u003C\u002Fh3\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003Epublic class ChooseSqlNode implements SqlNode {\n  private final SqlNode defaultSqlNode;\n  private final List&lt;SqlNode&gt; ifSqlNodes;\n\n  public ChooseSqlNode(List&lt;SqlNode&gt; ifSqlNodes, SqlNode defaultSqlNode) {\n    this.ifSqlNodes = ifSqlNodes;\n    this.defaultSqlNode = defaultSqlNode;\n  }\n\n  @Override\n  public boolean apply(DynamicContext context) {\n    \u002F\u002F 遍历所有when分支节点，只要遇到第一个为true就返回\n    for (SqlNode sqlNode : ifSqlNodes) {\n      if (sqlNode.apply(context)) {\n        return true;\n      }\n    }\n    \u002F\u002F 全部when都为false时，走otherwise分支\n    if (defaultSqlNode != null) {\n      defaultSqlNode.apply(context);\n      return true;\n    }\n    return false;\n  }\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Ch3\u003E\u003Cb\u003EForEachSqlNode\u003C\u002Fb\u003E\u003C\u002Fh3\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003Epublic class ForEachSqlNode implements SqlNode {\n  public static final String ITEM_PREFIX = &#34;__frch_&#34;;\n\n  private final ExpressionEvaluator evaluator;\n  private final String collectionExpression;\n  private final SqlNode contents;\n  private final String open;\n  private final String close;\n  private final String separator;\n  private final String item;\n  private final String index;\n  private final Configuration configuration;\n\n  public ForEachSqlNode(Configuration configuration, SqlNode contents, String collectionExpression, String index, String item, String open, String close, String separator) {\n    this.evaluator = new ExpressionEvaluator();\n    this.collectionExpression = collectionExpression;\n    this.contents = contents;\n    this.open = open;\n    this.close = close;\n    this.separator = separator;\n    this.index = index;\n    this.item = item;\n    this.configuration = configuration;\n  }\n\n  @Override\n  public boolean apply(DynamicContext context) {\n    Map&lt;String, Object&gt; bindings = context.getBindings();\n    \u002F\u002F 将Map\u002FArray\u002FList统一包装为迭代器接口\n    final Iterable&lt;?&gt; iterable = evaluator.evaluateIterable(collectionExpression, bindings);\n    if (!iterable.iterator().hasNext()) {\n      return true;\n    }\n    boolean first = true;\n    applyOpen(context);\n    int i = 0;\n    \u002F\u002F 遍历集合\n    for (Object o : iterable) {\n      DynamicContext oldContext = context;\n      if (first || separator == null) {\n        context = new PrefixedContext(context, &#34;&#34;);\n      } else {\n        context = new PrefixedContext(context, separator);\n      }\n      int uniqueNumber = context.getUniqueNumber();\n      \u002F\u002F Issue #709 \n      if (o instanceof Map.Entry) {  \u002F\u002FMap条目处理\n        @SuppressWarnings(&#34;unchecked&#34;) \n        Map.Entry&lt;Object, Object&gt; mapEntry = (Map.Entry&lt;Object, Object&gt;) o;\n        applyIndex(context, mapEntry.getKey(), uniqueNumber);\n        applyItem(context, mapEntry.getValue(), uniqueNumber);\n      } else { \u002F\u002F List条目处理\n        applyIndex(context, i, uniqueNumber);\n        applyItem(context, o, uniqueNumber);\n      }\n      \u002F\u002F 子节点SqlNode处理，很重要的一个逻辑就是将#{item.XXX}转换为#{__frch_item_N.XXX}，这样在JDBC设置参数的时候就能够找到对应的参数值了\n      contents.apply(new FilteredDynamicContext(configuration, context, index, item, uniqueNumber));\n      if (first) {\n        first = !((PrefixedContext) context).isPrefixApplied();\n      }\n      context = oldContext;\n      i++;\n    }\n    applyClose(context);\n    context.getBindings().remove(item);\n    context.getBindings().remove(index);\n    return true;\n  }\n\n  private void applyIndex(DynamicContext context, Object o, int i) {\n    if (index != null) {\n      context.bind(index, o);\n      context.bind(itemizeItem(index, i), o);\n    }\n  }\n\n  private void applyItem(DynamicContext context, Object o, int i) {\n    if (item != null) {\n      context.bind(item, o);\n      context.bind(itemizeItem(item, i), o);\n    }\n  }\n\n  private void applyOpen(DynamicContext context) {\n    if (open != null) {\n      context.appendSql(open);\n    }\n  }\n\n  private void applyClose(DynamicContext context) {\n    if (close != null) {\n      context.appendSql(close);\n    }\n  }\n\n  private static String itemizeItem(String item, int i) {\n    return new StringBuilder(ITEM_PREFIX).append(item).append(&#34;_&#34;).append(i).toString();\n  }\n\n  private static class FilteredDynamicContext extends DynamicContext {\n    private final DynamicContext delegate;\n    private final int index;\n    private final String itemIndex;\n    private final String item;\n\n    public FilteredDynamicContext(Configuration configuration,DynamicContext delegate, String itemIndex, String item, int i) {\n      super(configuration, null);\n      this.delegate = delegate;\n      this.index = i;\n      this.itemIndex = itemIndex;\n      this.item = item;\n    }\n\n    @Override\n    public Map&lt;String, Object&gt; getBindings() {\n      return delegate.getBindings();\n    }\n\n    @Override\n    public void bind(String name, Object value) {\n      delegate.bind(name, value);\n    }\n\n    @Override\n    public String getSql() {\n      return delegate.getSql();\n    }\n\n    @Override\n    public void appendSql(String sql) {\n      GenericTokenParser parser = new GenericTokenParser(&#34;#{&#34;, &#34;}&#34;, new TokenHandler() {\n        @Override\n        \u002F\u002F 将#{item.XXX}转换为#{__frch_item_N.XXX}\n        public String handleToken(String content) {\n          String newContent = content.replaceFirst(&#34;^\\\\s*&#34; + item + &#34;(?![^.,:\\\\s])&#34;, itemizeItem(item, index));\n          if (itemIndex != null &amp;&amp; newContent.equals(content)) {\n            newContent = content.replaceFirst(&#34;^\\\\s*&#34; + itemIndex + &#34;(?![^.,:\\\\s])&#34;, itemizeItem(itemIndex, index));\n          }\n          return new StringBuilder(&#34;#{&#34;).append(newContent).append(&#34;}&#34;).toString();\n        }\n      });\n\n      delegate.appendSql(parser.parse(sql));\n    }\n\n    @Override\n    public int getUniqueNumber() {\n      return delegate.getUniqueNumber();\n    }\n\n  }\n\n\n  private class PrefixedContext extends DynamicContext {\n    private final DynamicContext delegate;\n    private final String prefix;\n    private boolean prefixApplied;\n\n    public PrefixedContext(DynamicContext delegate, String prefix) {\n      super(configuration, null);\n      this.delegate = delegate;\n      this.prefix = prefix;\n      this.prefixApplied = false;\n    }\n\n    public boolean isPrefixApplied() {\n      return prefixApplied;\n    }\n\n    @Override\n    public Map&lt;String, Object&gt; getBindings() {\n      return delegate.getBindings();\n    }\n\n    @Override\n    public void bind(String name, Object value) {\n      delegate.bind(name, value);\n    }\n\n    @Override\n    public void appendSql(String sql) {\n      if (!prefixApplied &amp;&amp; sql != null &amp;&amp; sql.trim().length() &gt; 0) {\n        delegate.appendSql(prefix);\n        prefixApplied = true;\n      }\n      delegate.appendSql(sql);\n    }\n\n    @Override\n    public String getSql() {\n      return delegate.getSql();\n    }\n\n    @Override\n    public int getUniqueNumber() {\n      return delegate.getUniqueNumber();\n    }\n  }\n\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Ch3\u003E\u003Cb\u003EIfSqlNode\u003C\u002Fb\u003E\u003C\u002Fh3\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003Epublic class IfSqlNode implements SqlNode {\n  private final ExpressionEvaluator evaluator;  \u002F\u002F表达式执行器\n  private final String test;    \u002F\u002F条件表达式\n  private final SqlNode contents;\n\n  public IfSqlNode(SqlNode contents, String test) {\n    this.test = test;\n    this.contents = contents;\n    this.evaluator = new ExpressionEvaluator();\n  }\n\n  @Override\n  public boolean apply(DynamicContext context) {\n    if (evaluator.evaluateBoolean(test, context.getBindings())) {\n      contents.apply(context);\n      return true;\n    }\n    return false;\n  }\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp data-pid=\"sVePRprh\"\u003EExpressionEvaluator的定义如下：\u003C\u002Fp\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003Epublic class ExpressionEvaluator {\n  \u002F\u002F 布尔表达式解析，对于返回值为数字的if表达式,0为假，非0为真\n  public boolean evaluateBoolean(String expression, Object parameterObject) {\n    Object value = OgnlCache.getValue(expression, parameterObject);\n    if (value instanceof Boolean) {\n      return (Boolean) value;\n    }\n    if (value instanceof Number) {\n      return new BigDecimal(String.valueOf(value)).compareTo(BigDecimal.ZERO) != 0;\n    }\n    return value != null;\n  }\n\n   \u002F\u002F 循环表达式解析，主要用于foreach标签\n  public Iterable&lt;?&gt; evaluateIterable(String expression, Object parameterObject) {\n    Object value = OgnlCache.getValue(expression, parameterObject);\n    if (value == null) {\n      throw new BuilderException(&#34;The expression &#39;&#34; + expression + &#34;&#39; evaluated to a null value.&#34;);\n    }\n    if (value instanceof Iterable) {\n      return (Iterable&lt;?&gt;) value;\n    }\n    if (value.getClass().isArray()) {\n        \u002F\u002F the array may be primitive, so Arrays.asList() may throw\n        \u002F\u002F a ClassCastException (issue 209).  Do the work manually\n        \u002F\u002F Curse primitives! :) (JGB)\n        int size = Array.getLength(value);\n        List&lt;Object&gt; answer = new ArrayList&lt;Object&gt;();\n        for (int i = 0; i &lt; size; i++) {\n            Object o = Array.get(value, i);\n            answer.add(o);\n        }\n        return answer;\n    }\n    if (value instanceof Map) {\n      return ((Map) value).entrySet();\n    }\n    throw new BuilderException(&#34;Error evaluating expression &#39;&#34; + expression + &#34;&#39;.  Return value (&#34; + value + &#34;) was not iterable.&#34;);\n  }\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Ch3\u003E\u003Cb\u003EStaticTextSqlNode\u003C\u002Fb\u003E\u003C\u002Fh3\u003E\u003Cp data-pid=\"tzXoVho5\"\u003E　　静态文本节点不做任何处理，直接将本文本节点的内容追加到已经解析了的SQL文本的后面。\u003C\u002Fp\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003Epublic class StaticTextSqlNode implements SqlNode {\n  private final String text;\n\n  public StaticTextSqlNode(String text) {\n    this.text = text;\n  }\n\n  @Override\n  public boolean apply(DynamicContext context) {\n    context.appendSql(text);\n    return true;\n  }\n\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Ch3\u003E\u003Cb\u003ETextSqlNode\u003C\u002Fb\u003E\u003C\u002Fh3\u003E\u003Cp data-pid=\"0KeuJEXR\"\u003E　　TextSqlNode主要是用来将${}转换为实际的参数值，并返回拼接后的SQL语句，为了防止SQL注入，可以通过标签来创建OGNL上下文变量。\u003C\u002Fp\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003Epublic class TextSqlNode implements SqlNode {\n  private final String text;\n  private final Pattern injectionFilter;\n\n  public TextSqlNode(String text) {\n    this(text, null);\n  }\n\n  public TextSqlNode(String text, Pattern injectionFilter) {\n    this.text = text;\n    this.injectionFilter = injectionFilter;\n  }\n\n  public boolean isDynamic() {\n    DynamicCheckerTokenParser checker = new DynamicCheckerTokenParser();\n    GenericTokenParser parser = createParser(checker);\n    parser.parse(text);\n    return checker.isDynamic();\n  }\n\n  @Override\n  public boolean apply(DynamicContext context) {\n    GenericTokenParser parser = createParser(new BindingTokenParser(context, injectionFilter));\n    context.appendSql(parser.parse(text));\n    return true;\n  }\n\n  private GenericTokenParser createParser(TokenHandler handler) {\n    return new GenericTokenParser(&#34;${&#34;, &#34;}&#34;, handler);\n  }\n\n  private static class BindingTokenParser implements TokenHandler {\n\n    private DynamicContext context;\n    private Pattern injectionFilter;\n\n    public BindingTokenParser(DynamicContext context, Pattern injectionFilter) {\n      this.context = context;\n      this.injectionFilter = injectionFilter;\n    }\n    \u002F\u002F 将${}中的值替换为查询参数中实际的值并返回，在StaticTextSqlNode中，#{}返回的是?\n    @Override\n    public String handleToken(String content) {\n      Object parameter = context.getBindings().get(&#34;_parameter&#34;);\n      if (parameter == null) {\n        context.getBindings().put(&#34;value&#34;, null);\n      } else if (SimpleTypeRegistry.isSimpleType(parameter.getClass())) {\n        context.getBindings().put(&#34;value&#34;, parameter);\n      }\n      Object value = OgnlCache.getValue(content, context.getBindings());\n      String srtValue = (value == null ? &#34;&#34; : String.valueOf(value)); \u002F\u002F issue #274 return &#34;&#34; instead of &#34;null&#34;\n      checkInjection(srtValue);\n      return srtValue;\n    }\n\n    private void checkInjection(String value) {\n      if (injectionFilter != null &amp;&amp; !injectionFilter.matcher(value).matches()) {\n        throw new ScriptingException(&#34;Invalid input. Please conform to regex&#34; + injectionFilter.pattern());\n      }\n    }\n  }\n\n  private static class DynamicCheckerTokenParser implements TokenHandler {\n\n    private boolean isDynamic;\n\n    public DynamicCheckerTokenParser() {\n      \u002F\u002F Prevent Synthetic Access\n    }\n\n    public boolean isDynamic() {\n      return isDynamic;\n    }\n\n    @Override\n    public String handleToken(String content) {\n      this.isDynamic = true;\n      return null;\n    }\n  }\n\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Ch3\u003E\u003Cb\u003EVarDeclSqlNode\u003C\u002Fb\u003E\u003C\u002Fh3\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003Epublic class VarDeclSqlNode implements SqlNode {\n\n  private final String name;\n  private final String expression;\n\n  public VarDeclSqlNode(String var, String exp) {\n    name = var;\n    expression = exp;\n  }\n\n  @Override\n  public boolean apply(DynamicContext context) {\n    final Object value = OgnlCache.getValue(expression, context.getBindings());\n    \u002F\u002F 直接将ognl表达式加到当前映射语句的上下文中，这样就可以直接获取到了\n    context.bind(name, value);\n    return true;\n  }\n\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp data-pid=\"6xfaAH19\"\u003E　　DynamicContext.bind方法的实现如下：\u003C\u002Fp\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003Eprivate final ContextMap bindings;\n  public void bind(String name, Object value) {\n    bindings.put(name, value);\n  }\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Ch3\u003E\u003Cb\u003ETrimSqlNode\u003C\u002Fb\u003E\u003C\u002Fh3\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003Epublic class TrimSqlNode implements SqlNode {\n\n  private final SqlNode contents;\n  private final String prefix;\n  private final String suffix;\n  private final List&lt;String&gt; prefixesToOverride;  \u002F\u002F 要trim多个文本的话,|分隔即可\n  private final List&lt;String&gt; suffixesToOverride;  \u002F\u002F 要trim多个文本的话,|分隔即可\n  private final Configuration configuration;\n\n  public TrimSqlNode(Configuration configuration, SqlNode contents, String prefix, String prefixesToOverride, String suffix, String suffixesToOverride) {\n    this(configuration, contents, prefix, parseOverrides(prefixesToOverride), suffix, parseOverrides(suffixesToOverride));\n  }\n\n  protected TrimSqlNode(Configuration configuration, SqlNode contents, String prefix, List&lt;String&gt; prefixesToOverride, String suffix, List&lt;String&gt; suffixesToOverride) {\n    this.contents = contents;\n    this.prefix = prefix;\n    this.prefixesToOverride = prefixesToOverride;\n    this.suffix = suffix;\n    this.suffixesToOverride = suffixesToOverride;\n    this.configuration = configuration;\n  }\n\n  @Override\n  public boolean apply(DynamicContext context) {\n    FilteredDynamicContext filteredDynamicContext = new FilteredDynamicContext(context);\n    \u002F\u002F trim节点只有在至少有一个子节点不为空的时候才有意义\n    boolean result = contents.apply(filteredDynamicContext);\n    \u002F\u002F 所有子节点处理完成之后,filteredDynamicContext.delegate里面就包含解析后的静态SQL文本了，此时就可以处理前后的trim了\n    filteredDynamicContext.applyAll();\n    return result;\n  }\n\n  private static List&lt;String&gt; parseOverrides(String overrides) {\n    if (overrides != null) {\n      final StringTokenizer parser = new StringTokenizer(overrides, &#34;|&#34;, false);\n      final List&lt;String&gt; list = new ArrayList&lt;String&gt;(parser.countTokens());\n      while (parser.hasMoreTokens()) {\n        list.add(parser.nextToken().toUpperCase(Locale.ENGLISH));\n      }\n      return list;\n    }\n    return Collections.emptyList();\n  }\n\n  private class FilteredDynamicContext extends DynamicContext {\n    private DynamicContext delegate;\n    private boolean prefixApplied;\n    private boolean suffixApplied;\n    private StringBuilder sqlBuffer;\n\n    public FilteredDynamicContext(DynamicContext delegate) {\n      super(configuration, null);\n      this.delegate = delegate;\n      this.prefixApplied = false;\n      this.suffixApplied = false;\n      this.sqlBuffer = new StringBuilder();\n    }\n\n    public void applyAll() {\n      sqlBuffer = new StringBuilder(sqlBuffer.toString().trim());\n      String trimmedUppercaseSql = sqlBuffer.toString().toUpperCase(Locale.ENGLISH);\n      if (trimmedUppercaseSql.length() &gt; 0) {\n        applyPrefix(sqlBuffer, trimmedUppercaseSql);\n        applySuffix(sqlBuffer, trimmedUppercaseSql);\n      }\n      delegate.appendSql(sqlBuffer.toString());\n    }\n\n    @Override\n    public Map&lt;String, Object&gt; getBindings() {\n      return delegate.getBindings();\n    }\n\n    @Override\n    public void bind(String name, Object value) {\n      delegate.bind(name, value);\n    }\n\n    @Override\n    public int getUniqueNumber() {\n      return delegate.getUniqueNumber();\n    }\n\n    @Override\n    public void appendSql(String sql) {\n      sqlBuffer.append(sql);\n    }\n\n    @Override\n    public String getSql() {\n      return delegate.getSql();\n    }\n    \u002F\u002F 处理前缀\n    private void applyPrefix(StringBuilder sql, String trimmedUppercaseSql) {\n      if (!prefixApplied) {\n        prefixApplied = true;\n        if (prefixesToOverride != null) {\n          for (String toRemove : prefixesToOverride) {\n            if (trimmedUppercaseSql.startsWith(toRemove)) {\n              sql.delete(0, toRemove.trim().length());\n              break;\n            }\n          }\n        }\n        if (prefix != null) {\n          sql.insert(0, &#34; &#34;);\n          sql.insert(0, prefix);\n        }\n      }\n    }\n\n    \u002F\u002F 处理后缀\n    private void applySuffix(StringBuilder sql, String trimmedUppercaseSql) {\n      if (!suffixApplied) {\n        suffixApplied = true;\n        if (suffixesToOverride != null) {\n          for (String toRemove : suffixesToOverride) {\n            if (trimmedUppercaseSql.endsWith(toRemove) || trimmedUppercaseSql.endsWith(toRemove.trim())) {\n              int start = sql.length() - toRemove.trim().length();\n              int end = sql.length();\n              sql.delete(start, end);\n              break;\n            }\n          }\n        }\n        if (suffix != null) {\n          sql.append(&#34; &#34;);\n          sql.append(suffix);\n        }\n      }\n    }\n  }\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Ch3\u003E\u003Cb\u003ESetSqlNode\u003C\u002Fb\u003E\u003C\u002Fh3\u003E\u003Cp data-pid=\"v_n1AKRo\"\u003E　　SetSqlNode直接委托给TrimSqlNode处理。参见TrimSqlNode。\u003C\u002Fp\u003E\u003Ch3\u003E\u003Cb\u003EWhereSqlNode\u003C\u002Fb\u003E\u003C\u002Fh3\u003E\u003Cp data-pid=\"M5ervmQt\"\u003E　　WhereSqlNode直接委托给TrimSqlNode处理。参见TrimSqlNode。\u003C\u002Fp\u003E\u003Ch3\u003E\u003Cb\u003E3.3 BaseBuilder\u003C\u002Fb\u003E\u003C\u002Fh3\u003E\u003Cp data-pid=\"WlKUJ3d7\"\u003E　　从整个设计角度来说，BaseBuilder的目的是为了统一解析的使用，但在实现上却出入较大。首先，BaseBuilder是所有解析类的MapperBuilderAssistant、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder等的父类。如下所示：\u003Cbr\u002F\u003E\u003C\u002Fp\u003E\u003Cfigure data-size=\"normal\"\u003E\u003Cnoscript\u003E\u003Cimg src=\"https:\u002F\u002Fpic2.zhimg.com\u002Fv2-3c40829a650f96ab57be6975d78f8601_b.jpg\" data-caption=\"\" data-size=\"normal\" class=\"content_image\"\u002F\u003E\u003C\u002Fnoscript\u003E\u003Cimg src=\"data:image\u002Fsvg+xml;utf8,&lt;svg xmlns=&#39;http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg&#39; width=&#39;0&#39; height=&#39;0&#39;&gt;&lt;\u002Fsvg&gt;\" data-caption=\"\" data-size=\"normal\" class=\"content_image lazy\" data-actualsrc=\"https:\u002F\u002Fpic2.zhimg.com\u002Fv2-3c40829a650f96ab57be6975d78f8601_b.jpg\" data-original-token=\"v2-3c40829a650f96ab57be6975d78f8601\"\u002F\u003E\u003C\u002Ffigure\u003E\u003Cp data-pid=\"ans0KMlz\"\u003E\u003Cbr\u002F\u003E　　BaseBuilder中提供类型处理器、JDBC类型、结果集类型、别名等的解析，因为在mybatis配置文件、mapper文件解析、SQL映射语句解析、基于注解的mapper文件解析过程中，都会频繁的遇到类型处理相关的解析。但是BaseBuilder也没有定义需要子类实现的负责解析的抽象接口，虽然XMLMapperBuilder、XMLConfigBuilder的解析入口是parse方法，XMLStatementBuilder的入口是parseStatementNode，不仅如此，MapperBuilderAssistant继承了BaseBuilder，而不是MapperAnnotationBuilder，实际上MapperAnnotationBuilder才是解析Mapper接口的主控类。\u003C\u002Fp\u003E\u003Cp data-pid=\"g-cOC5_S\"\u003E　　所以从实现上来说，BaseBuilder如果要作为具体Builder类的抽象父类，那就应该定义一个需要子类实现的parse接口，要么就用组合代替继承。\u003C\u002Fp\u003E\u003Ch3\u003E\u003Cb\u003E3.4 AdditionalParameter\u003C\u002Fb\u003E\u003C\u002Fh3\u003E\u003Cp data-pid=\"jneqv7_D\"\u003E　　额外参数主要是维护一些在加载时无法确定的参数，比如标签中的参数在加载时就无法尽最大努力确定，必须通过运行时执行org.apache.ibatis.scripting.xmltags.DynamicSqlSource.getBoundSql()中的SqlNode.apply()才能确定真正要执行的SQL语句，以及额外参数。比如，对于下列的foreach语句，它的AdditionalParameter内容为：\u003Cbr\u002F\u003E{\u003Cb\u003Efrch_index_0=0, item=2,\u003C\u002Fb\u003E frch_index_1=1, _parameter=org.mybatis.internal.example.pojo.UserReq@5ccddd20, index=1, \u003Cb\u003Efrch_item_1=2, _databaseId=null,\u003C\u002Fb\u003E frch_item_0=1}\u003Cbr\u002F\u003E　　其中_parameter和_databaseId在DynamicContext构造器中硬编码，其他值通过调用ForEachSqlNode.apply()计算得到。与此相对应，此时SQL语句在应用ForeachSqlNode之后，对参数名也进行重写，如下所示：\u003C\u002Fp\u003E\u003Cblockquote data-pid=\"wiEnkHiu\"\u003Eselect lfPartyId,author as authors,subject,comments,title,partyName from LfParty where partyName = #{partyName} AND partyName like #{partyName} and lfPartyId in          (           #{__frch_item_0.prop}          ,          #{__frch_item_1}          )\u003C\u002Fblockquote\u003E\u003Cp data-pid=\"_CRfSFbE\"\u003E　　然后通过SqlSourceBuilder.parse()调用ParameterMappingTokenHandler计算出该sql的ParameterMapping列表，最后构造出StaticSqlSource。\u003C\u002Fp\u003E\u003Ch3\u003E\u003Cb\u003E3.5 TypeHandler\u003C\u002Fb\u003E\u003C\u002Fh3\u003E\u003Cp data-pid=\"QcvTIdVO\"\u003E　　当MyBatis将一个Java对象作为输入\u002F输出参数执行CRUD语句操作时，它会创建一个PreparedStatement对象，并且调用setXXX()为占位符设置相应的参数值。XXX可以是Int，String，Date等Java内置类型，或者用户自定义的类型。在实现上，MyBatis是通过使用类型处理器（type handler）来确定XXX是具体什么类型的。MyBatis对于下列类型使用内建的类型处理器：所有的基本数据类型、基本类型的包裹类型、byte[] 、java.util.Date、java.sql.Date、java,sql.Time、java.sql.Timestamp、java 枚举类型等。对于用户自定义的类型，我们可以创建一个自定义的类型处理器。要创建自定义类型处理器，只要实现TypeHandler接口即可，TypeHandler接口的定义如下：\u003C\u002Fp\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003Epublic interface TypeHandler&lt;T&gt; {\n\n  void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException;\n\n  T getResult(ResultSet rs, String columnName) throws SQLException;\n\n  T getResult(ResultSet rs, int columnIndex) throws SQLException;\n\n  T getResult(CallableStatement cs, int columnIndex) throws SQLException;\n\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp data-pid=\"fvRsUR1n\"\u003E　　虽然我们可以直接实现TypeHandler接口，但是在实践中，我们一般选择继承BaseTypeHandler，BaseTypeHandler为TypeHandler提供了部分骨架代码，使得用户使用方便，几乎所有mybatis内置类型处理器都继承于BaseTypeHandler。下面我们实现一个最简单的自定义类型处理器MobileTypeHandler。\u003C\u002Fp\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003Epublic class MobileTypeHandler extends BaseTypeHandler&lt;Mobile&gt; {  \n\n    @Override  \n    public Mobile getNullableResult(ResultSet rs, String columnName)  \n            throws SQLException {  \n        \u002F\u002F mobile字段是VARCHAR类型，所以使用rs.getString\n        return new Mobile(rs.getString(columnName));  \n    }  \n\n    @Override  \n    public Mobile getNullableResult(ResultSet rs, int columnIndex)  \n            throws SQLException {  \n        return new Mobile(rs.getString(columnIndex));  \n    }  \n\n    @Override  \n    public Mobile getNullableResult(CallableStatement cs, int columnIndex)  \n            throws SQLException {  \n        return new Mobile(cs.getString(columnIndex));  \n    }  \n\n    @Override  \n    public void setNonNullParameter(PreparedStatement ps, int i,  \n            Mobile param, JdbcType jdbcType) throws SQLException {  \n        ps.setString(i, param.getFullNumber());  \n    }  \n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp data-pid=\"k_LTauKq\"\u003E　　我们实现了自定义的类型处理器后，只要在mybatis配置文件mybatis-config.xml中注册就可以使用了，如下：\u003C\u002Fp\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003E&lt;typeHandlers&gt;  \n    &lt;typeHandler handler=&#34;org.mybatis.internal.example.MobileTypeHandler&#34; \u002F&gt;  \n&lt;\u002FtypeHandlers&gt;\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp data-pid=\"umF6Hlyb\"\u003E　　上述完成之后，当我们在parameterType或者resultType或者resultMap中遇到Mobile类型的属性时，就会调用MobileTypeHandler进行代理出入参的设置和获取。\u003C\u002Fp\u003E\u003Ch3\u003E\u003Cb\u003E3.6 对象包装器工厂ObjectWrapperFactory\u003C\u002Fb\u003E\u003C\u002Fh3\u003E\u003Cp data-pid=\"tuJ7Di6k\"\u003E　　ObjectWrapperFactory是一个对象包装器工厂,用于对返回的结果对象进行二次处理,它主要在org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getRowValue方法中创建对象的MetaObject时作为参数设置进去,这样MetaObject中的objectWrapper属性就可以被设置为我们自定义的ObjectWrapper实现而不是mybatis内置实现,如下所示：\u003C\u002Fp\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003Eprivate MetaObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) {\n    this.originalObject = object;\n    this.objectFactory = objectFactory;\n    this.objectWrapperFactory = objectWrapperFactory;\n    this.reflectorFactory = reflectorFactory;\n\n    if (object instanceof ObjectWrapper) {\n      this.objectWrapper = (ObjectWrapper) object;\n    } else if (objectWrapperFactory.hasWrapperFor(object)) { \u002F\u002F 如果有自定义的ObjectWrapperFactory,就不会总是返回false了,这样对于特定类就启用了的我们自定义的ObjectWrapper\n      this.objectWrapper = objectWrapperFactory.getWrapperFor(this, object);\n    } else if (object instanceof Map) {\n      this.objectWrapper = new MapWrapper(this, (Map) object);\n    } else if (object instanceof Collection) {\n      this.objectWrapper = new CollectionWrapper(this, (Collection) object);\n    } else {\n      this.objectWrapper = new BeanWrapper(this, object);\n    }\n  }\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp data-pid=\"bUQiBDHO\"\u003E　　典型的下划线转驼峰,我们就可以使用ObjectWrapperFactory来统一处理(当然,在实际中,我们一般不会这么做,而是通过设置mapUnderscoreToCamelCase来实现)。ObjectWrapperFactory 接口如下：\u003C\u002Fp\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003Epublic interface ObjectWrapperFactory {\n\n  boolean hasWrapperFor(Object object);\n\n  ObjectWrapper getWrapperFor(MetaObject metaObject, Object object);\n\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp data-pid=\"TYEKMq_I\"\u003E　　通过实现这个接口，可以判断当object是特定类型时，返回true，然后在下面的getWrapperFor中返回一个可以处理key为驼峰的ObjectWrapper 实现类即可。ObjectWrapper类可以说是对象反射信息的facade模式，它的定义如下：\u003C\u002Fp\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003Epublic interface ObjectWrapper {\n\n  Object get(PropertyTokenizer prop);\n\n  void set(PropertyTokenizer prop, Object value);\n\n  String findProperty(String name, boolean useCamelCaseMapping);\n\n  String[] getGetterNames();\n\n  String[] getSetterNames();\n\n  Class&lt;?&gt; getSetterType(String name);\n\n  Class&lt;?&gt; getGetterType(String name);\n\n  boolean hasSetter(String name);\n\n  boolean hasGetter(String name);\n\n  MetaObject instantiatePropertyValue(String name, PropertyTokenizer prop, ObjectFactory objectFactory);\n\n  boolean isCollection();\n\n  void add(Object element);\n\n  &lt;E&gt; void addAll(List&lt;E&gt; element);\n\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp data-pid=\"4cbgfu0_\"\u003E　　当然，我们不需要从头实现ObjectWrapper接口,可以选择继承BeanWrapper或者MapWrapper。比如对于Map类型，我们可以继承MapWrapper，让参数useCamelCaseMapping起作用。MapWrapper默认的findProperty方法并没有做驼峰转换处理，如下：：\u003C\u002Fp\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003E@Override\n  public String findProperty(String name, boolean useCamelCaseMapping) {\n    return name;\n  }\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp data-pid=\"SO-EH84Z\"\u003E　　我们可以改成：\u003C\u002Fp\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003Epublic class CamelMapWrapper extends MapWrapper {\n    public CamelMapWrapper(MetaObject metaObject, Map&lt;String, Object&gt; map) {\n        super(metaObject, map);\n    }\n\n    @Override\n    public String findProperty(String name, boolean useCamelCaseMapping) {\n        if (useCamelCaseMapping\n                &amp;&amp; ((name.charAt(0) &gt;= &#39;A&#39; &amp;&amp; name.charAt(0) &lt;= &#39;Z&#39;)\n                     || name.indexOf(&#34;_&#34;) &gt;= 0)) {\n            return underlineToCamelhump(name);\n        }\n        return name;\n    }\n\n    \u002F**\n     * 将下划线风格替换为驼峰风格\n     *\u002F\n    public String underlineToCamelhump(String inputString) {\n        StringBuilder sb = new StringBuilder();\n\n        boolean nextUpperCase = false;\n        for (int i = 0; i &lt; inputString.length(); i++) {\n            char c = inputString.charAt(i);\n            if (c == &#39;_&#39;) {\n                if (sb.length() &gt; 0) {\n                    nextUpperCase = true;\n                }\n            } else {\n                if (nextUpperCase) {\n                    sb.append(Character.toUpperCase(c));\n                    nextUpperCase = false;\n                } else {\n                    sb.append(Character.toLowerCase(c));\n                }\n            }\n        }\n        return sb.toString();\n    }\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp data-pid=\"yxYWv-Rs\"\u003E　　同时，创建一个自定义的objectWrapperFactory如下：\u003C\u002Fp\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003Epublic class CustomWrapperFactory implements ObjectWrapperFactory {\n\n    @Override\n    public boolean hasWrapperFor(Object object) {\n        return object != null &amp;&amp; object instanceof Map;\n    }\n\n    @Override\n    public ObjectWrapper getWrapperFor(MetaObject metaObject, Object object) {\n        return new CamelMapWrapper(metaObject, (Map) object);\n    }\n\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp data-pid=\"4_f8zxX6\"\u003E　　然后，在 MyBatis 配置文件中配置上objectWrapperFactory：\u003C\u002Fp\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003E&lt;objectWrapperFactory type=&#34;org.mybatis.internal.example.CustomWrapperFactory&#34;\u002F&gt;\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp data-pid=\"42MSu_YI\"\u003E　　同样，useCamelCaseMapping最终是通过mapUnderscoreToCamelCase设置注入进来的，所以settings要加上这个设置：\u003C\u002Fp\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003E&lt;setting name=&#34;mapUnderscoreToCamelCase&#34; value=&#34;true&#34;\u002F&gt;\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp data-pid=\"dBTGkWzN\"\u003E　　此时，如果resultType是map类型的话,就可以看到key已经是驼峰式而不是columnName了。\u003Cbr\u002F\u003E　　注意：mybatis提供了一个什么都不做的默认实现DefaultObjectWrapperFactory。\u003C\u002Fp\u003E\u003Ch3\u003E\u003Cb\u003E3.7 MetaObject\u003C\u002Fb\u003E\u003C\u002Fh3\u003E\u003Cp data-pid=\"a9MWBMmh\"\u003E　　MetaObject是一个对象包装器，其性质上有点类似ASF提供的commons类库，其中包装了对象的元数据信息，对象本身，对象反射工厂，对象包装器工厂等。使得根据OGNL表达式设置或者获取对象的属性更为便利，也可以更加方便的判断对象中是否包含指定属性、指定属性是否具有getter、setter等。主要的功能是通过其ObjectWrapper类型的属性完成的，它包装了操作对象元数据以及对象本身的主要接口，操作标准对象的实现是BeanWrapper。BeanWrapper类型有个MetaClass类型的属性，MetaClass中有个Reflector属性，其中包含了可读、可写的属性、方法以及构造器信息。\u003C\u002Fp\u003E\u003Ch3\u003E\u003Cb\u003E3.8 对象工厂ObjectFactory\u003C\u002Fb\u003E\u003C\u002Fh3\u003E\u003Cp data-pid=\"ic3I3gu4\"\u003E　　MyBatis 每次创建结果对象的新实例时，都会使用一个对象工厂（ObjectFactory）实例来完成。 默认的对象工厂DefaultObjectFactory仅仅是实例化目标类，要么通过默认构造方法，要么在参数映射存在的时候通过参数构造方法来实例化。如果想覆盖对象工厂的默认行为比如给某些属性设置默认值(有些时候直接修改对象不可行，或者由于不是自己拥有的代码或者改动太大)，则可以通过创建自己的对象工厂来实现。ObjectFactory接口定义如下：\u003C\u002Fp\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003Epublic interface ObjectFactory {\n\n  \u002F**\n   * Sets configuration properties.\n   * @param properties configuration properties\n   *\u002F\n  void setProperties(Properties properties);\n\n  \u002F**\n   * Creates a new object with default constructor. \n   * @param type Object type\n   * @return\n   *\u002F\n  &lt;T&gt; T create(Class&lt;T&gt; type);\n\n  \u002F**\n   * Creates a new object with the specified constructor and params.\n   * @param type Object type\n   * @param constructorArgTypes Constructor argument types\n   * @param constructorArgs Constructor argument values\n   * @return\n   *\u002F\n  &lt;T&gt; T create(Class&lt;T&gt; type, List&lt;Class&lt;?&gt;&gt; constructorArgTypes, List&lt;Object&gt; constructorArgs);\n\n  \u002F**\n   * Returns true if this object can have a set of other objects.\n   * It&#39;s main purpose is to support non-java.util.Collection objects like Scala collections.\n   * \n   * @param type Object type\n   * @return whether it is a collection or not\n   * @since 3.1.0\n   *\u002F\n  &lt;T&gt; boolean isCollection(Class&lt;T&gt; type);\n\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp data-pid=\"2CwfwG8I\"\u003E　　从这个接口定义可以看出，它包含了两种通过反射机制构造实体类对象的方法，一种是通过无参构造函数，一种是通过带参数的构造函数。同时，为了使工厂类能设置其他属性，还提供了setProperties()方法。\u003Cbr\u002F\u003E　　要自定义对象工厂类，我们可以实现ObjectFactory这个接口，但是这样我们就需要自己去实现一些在DefaultObjectFactory已经实现好了的东西，所以也可以继承这个DefaultObjectFactory类，这样可以使得实现起来更为简单。例如，我们希望给Order对象的属性hostname设置为本地机器名，可以像下面这么实现：\u003C\u002Fp\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003Epublic class CustomObjectFactory extends DefaultObjectFactory{  \n  private static String hostname;\n  static {\n      InetAddress addr = InetAddress.getLocalHost();  \n      String ip=addr.getHostAddress().toString(); \u002F\u002F获取本机ip  \n      hostName=addr.getHostName().toString(); \u002F\u002F获取本机计算机名称  \n  }\n    private static final long serialVersionUID = 1128715667301891724L;  \n\n    @Override  \n    public &lt;T&gt; T create(Class&lt;T&gt; type) {  \n        T result = super.create(type);  \n        if(type.equals(Order.class)){  \n            ((Order)result).setIp(hostname);  \n        }  \n        return result;  \n    }  \n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp data-pid=\"1ruo6jbt\"\u003E　　接下来，在配置文件中配置对象工厂类为我们创建的对象工厂类CustomObjectFactory。\u003C\u002Fp\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003E&lt;objectFactory type=&#34;org.mybatis.internal.example.CustomObjectFactory&#34;&gt;&lt;\u002FobjectFactory&gt;\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp data-pid=\"2_Nmcz7K\"\u003E　　此时执行代码，就会发现返回的Order对象中ip字段的值为本机名。\u003C\u002Fp\u003E\u003Cp data-pid=\"O-mhwK-P\"\u003E3.9 MappedStatement\u003Cbr\u002F\u003E　　mapper文件或者mapper接口中每个映射语句都对应一个MappedStatement实例，它包含了所有运行时需要的信息比如结果映射、参数映射、是否需要刷新缓存等。MappedStatement定义如下：\u003Cbr\u002F\u003Epublic final class MappedStatement {\u003C\u002Fp\u003E\u003Cp data-pid=\"idCreToC\"\u003Eprivate String resource;\u003Cbr\u002F\u003Eprivate Configuration configuration;\u003Cbr\u002F\u003Eprivate String id;\u003Cbr\u002F\u003Eprivate Integer fetchSize;\u003Cbr\u002F\u003Eprivate Integer timeout;\u003Cbr\u002F\u003Eprivate StatementType statementType;\u003Cbr\u002F\u003Eprivate ResultSetType resultSetType;\u003Cbr\u002F\u003Eprivate SqlSource sqlSource;\u003Cbr\u002F\u003Eprivate Cache cache;\u003Cbr\u002F\u003Eprivate ParameterMap parameterMap;\u003Cbr\u002F\u003Eprivate List resultMaps;\u003Cbr\u002F\u003Eprivate boolean flushCacheRequired;\u003Cbr\u002F\u003Eprivate boolean useCache;\u003Cbr\u002F\u003Eprivate boolean resultOrdered;\u003Cbr\u002F\u003Eprivate SqlCommandType sqlCommandType;\u003Cbr\u002F\u003Eprivate KeyGenerator keyGenerator;\u003Cbr\u002F\u003Eprivate String[] keyProperties;\u003Cbr\u002F\u003Eprivate String[] keyColumns;\u003Cbr\u002F\u003Eprivate boolean hasNestedResultMaps;\u003Cbr\u002F\u003Eprivate String databaseId;\u003Cbr\u002F\u003Eprivate Log statementLog;\u003Cbr\u002F\u003Eprivate LanguageDriver lang;\u003Cbr\u002F\u003Eprivate String[] resultSets;\u003Cbr\u002F\u003E…\u003C\u002Fp\u003E\u003Cp data-pid=\"3lxTnPzt\"\u003Epublic MappedStatement build() {\u003Cbr\u002F\u003Eassert mappedStatement.configuration != null;\u003Cbr\u002F\u003Eassert mappedStatement.id != null;\u003Cbr\u002F\u003Eassert mappedStatement.sqlSource != null;\u003Cbr\u002F\u003Eassert mappedStatement.lang != null;\u003Cbr\u002F\u003EmappedStatement.resultMaps = Collections.unmodifiableList(mappedStatement.resultMaps);\u003Cbr\u002F\u003Ereturn mappedStatement;\u003Cbr\u002F\u003E}\u003Cbr\u002F\u003E}\u003Cbr\u002F\u003E…\u003Cbr\u002F\u003E}\u003Cbr\u002F\u003E　　唯一值得注意的是resultMaps被设计为只读,这样应用可以查看但是不能修改。\u003C\u002Fp\u003E\u003Cp data-pid=\"SZ579yCY\"\u003E3.10 ParameterMapping\u003Cbr\u002F\u003E　　每个参数映射&lt;&gt;标签都被创建为一个ParameterMapping实例，其中包含和结果映射类似的信息，如下：\u003Cbr\u002F\u003Epublic class ParameterMapping {\u003C\u002Fp\u003E\u003Cp data-pid=\"vwhkbnCw\"\u003Eprivate Configuration configuration;\u003C\u002Fp\u003E\u003Cp data-pid=\"4pvZkB74\"\u003Eprivate String property;\u003Cbr\u002F\u003Eprivate ParameterMode mode;\u003Cbr\u002F\u003Eprivate Class&lt;?&gt; javaType = Object.class;\u003Cbr\u002F\u003Eprivate JdbcType jdbcType;\u003Cbr\u002F\u003Eprivate Integer numericScale;\u003Cbr\u002F\u003Eprivate TypeHandler&lt;?&gt; typeHandler;\u003Cbr\u002F\u003Eprivate String resultMapId;\u003Cbr\u002F\u003Eprivate String jdbcTypeName;\u003Cbr\u002F\u003Eprivate String expression;\u003C\u002Fp\u003E\u003Cp data-pid=\"HUH6ikJR\"\u003Eprivate ParameterMapping() {\u003Cbr\u002F\u003E}\u003Cbr\u002F\u003E…\u003Cbr\u002F\u003E}\u003C\u002Fp\u003E\u003Cp data-pid=\"VIvFNQo9\"\u003E3.11 KeyGenerator\u003C\u002Fp\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003Epackage org.apache.ibatis.executor.keygen;\npublic interface KeyGenerator {\n  \u002F\u002F before key generator 主要用于oracle等使用序列机制的ID生成方式\n  void processBefore(Executor executor, MappedStatement ms, Statement stmt, Object parameter);\n  \u002F\u002F after key generator 主要用于mysql等使用自增机制的ID生成方式\n  void processAfter(Executor executor, MappedStatement ms, Statement stmt, Object parameter);\n\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp data-pid=\"MGk6a9Y9\"\u003E3.12 各种Registry\u003Cbr\u002F\u003E　　mybatis将类型处理器，类型别名，mapper定义，语言驱动器等各种信息包装在Registry中维护，如下所示：\u003C\u002Fp\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003Epublic class Configuration {\n  ...\n  protected final MapperRegistry mapperRegistry = new MapperRegistry(this);\n  protected final InterceptorChain interceptorChain = new InterceptorChain();\n  protected final TypeHandlerRegistry typeHandlerRegistry = new TypeHandlerRegistry();\n  protected final TypeAliasRegistry typeAliasRegistry = new TypeAliasRegistry();\n  protected final LanguageDriverRegistry languageRegistry = new LanguageDriverRegistry();\n  ...\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp data-pid=\"DDgp-2hK\"\u003E　　各Registry中提供了相关的方法，比如TypeHandlerRegistry中包含了判断某个java类型是否有类型处理器以及获取类型处理器的方法，如下：\u003C\u002Fp\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003Epublic boolean hasTypeHandler(TypeReference&lt;?&gt; javaTypeReference, JdbcType jdbcType) {\n    return javaTypeReference != null &amp;&amp; getTypeHandler(javaTypeReference, jdbcType) != null;\n  }\n\n  public &lt;T&gt; TypeHandler&lt;T&gt; getTypeHandler(Class&lt;T&gt; type) {\n    return getTypeHandler((Type) type, null);\n  }\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Ch3\u003E\u003Cb\u003E3.13 LanguageDriver\u003C\u002Fb\u003E\u003C\u002Fh3\u003E\u003Cp data-pid=\"FZ6nQmgu\"\u003E　　从3.2版本开始，mybatis提供了LanguageDriver接口，我们可以使用该接口自定义SQL的解析方式。先来看下LanguageDriver接口中的3个方法：\u003C\u002Fp\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003Epublic interface LanguageDriver {\n\n  \u002F**\n   * Creates a {@link ParameterHandler} that passes the actual parameters to the the JDBC statement.\n   * 创建一个ParameterHandler对象，用于将实际参数赋值到JDBC语句中\n   * \n   * @param mappedStatement The mapped statement that is being executed\n   * @param parameterObject The input parameter object (can be null) \n   * @param boundSql The resulting SQL once the dynamic language has been executed.\n   * @return\n   * @author Frank D. Martinez [mnesarco]\n   * @see DefaultParameterHandler\n   *\u002F\n  ParameterHandler createParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql);\n\n  \u002F**\n   * Creates an {@link SqlSource} that will hold the statement read from a mapper xml file. \n   * It is called during startup, when the mapped statement is read from a class or an xml file.\n   * 将XML中读入的语句解析并返回一个sqlSource对象\n   * \n   * @param configuration The MyBatis configuration\n   * @param script XNode parsed from a XML file\n   * @param parameterType input parameter type got from a mapper method or specified in the parameterType xml attribute. Can be null.\n   * @return\n   *\u002F\n  SqlSource createSqlSource(Configuration configuration, XNode script, Class&lt;?&gt; parameterType);\n\n  \u002F**\n   * Creates an {@link SqlSource} that will hold the statement read from an annotation.\n   * It is called during startup, when the mapped statement is read from a class or an xml file.\n   * 将注解中读入的语句解析并返回一个sqlSource对象\n   * \n   * @param configuration The MyBatis configuration\n   * @param script The content of the annotation\n   * @param parameterType input parameter type got from a mapper method or specified in the parameterType xml attribute. Can be null.\n   * @return \n   *\u002F\n  SqlSource createSqlSource(Configuration configuration, String script, Class&lt;?&gt; parameterType);\n\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp data-pid=\"JSZGh-7d\"\u003E　　实现了LanguageDriver之后，可以在配置文件中指定该实现类作为SQL的解析器，在XML中我们可以使用 lang 属性来进行指定，如下：\u003C\u002Fp\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003E&lt;typeAliases&gt;\n  &lt;typeAlias type=&#34;org.sample.MyLanguageDriver&#34; alias=&#34;myLanguage&#34;\u002F&gt;\n&lt;\u002FtypeAliases&gt;\n\n&lt;select id=&#34;selectBlog&#34; lang=&#34;myLanguage&#34;&gt;\n  SELECT * FROM BLOG\n&lt;\u002Fselect&gt;\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp data-pid=\"rsAUj39F\"\u003E　　除了可以在语句级别指定外，也可以全局设置，如下：\u003C\u002Fp\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003E&lt;settings&gt;\n  &lt;setting name=&#34;defaultScriptingLanguage&#34; value=&#34;myLanguage&#34;\u002F&gt;\n&lt;\u002Fsettings&gt;\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp data-pid=\"4dZ_jHCz\"\u003E　　对于mapper接口，也可以使用@Lang注解，如下所示：\u003C\u002Fp\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003Epublic interface Mapper {\n  @Lang(MyLanguageDriver.class) \n  @Select(&#34;SELECT * FROM users&#34;)\n  List&lt;User&gt; selectUser();\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp data-pid=\"0m6CA9yp\"\u003E　　LanguageDriver的默认实现类为XMLLanguageDriver。Mybatis默认是XML语言，所以我们来看看XMLLanguageDriver的实现：\u003C\u002Fp\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003Epublic class XMLLanguageDriver implements LanguageDriver {\n  \u002F\u002F 创建参数处理器，返回默认的实现\n  @Override\n  public ParameterHandler createParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql) {\n    return new DefaultParameterHandler(mappedStatement, parameterObject, boundSql);\n  }\n\n  \u002F\u002F 根据XML定义创建SqlSource\n  @Override\n  public SqlSource createSqlSource(Configuration configuration, XNode script, Class&lt;?&gt; parameterType) {\n    XMLScriptBuilder builder = new XMLScriptBuilder(configuration, script, parameterType);\n    return builder.parseScriptNode();\n  }\n\n  \u002F\u002F 解析注解中的SQL语句\n  @Override\n  public SqlSource createSqlSource(Configuration configuration, String script, Class&lt;?&gt; parameterType) {\n    \u002F\u002F issue #3\n    if (script.startsWith(&#34;&lt;script&gt;&#34;)) {\n      XPathParser parser = new XPathParser(script, false, configuration.getVariables(), new XMLMapperEntityResolver());\n      return createSqlSource(configuration, parser.evalNode(&#34;\u002Fscript&#34;), parameterType);\n    } else {\n      \u002F\u002F issue #127\n      script = PropertyParser.parse(script, configuration.getVariables());\n      TextSqlNode textSqlNode = new TextSqlNode(script);\n      if (textSqlNode.isDynamic()) {\n        return new DynamicSqlSource(configuration, textSqlNode);\n      } else {\n        return new RawSqlSource(configuration, script, parameterType);\n      }\n    }\n  }\n\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp data-pid=\"8lEgd_uB\"\u003E　　如上所示，LanguageDriver将实际的实现根据采用的底层不同，委托给了具体的Builder，对于XML配置，委托给XMLScriptBuilder。对于使用Velocity模板的解析器，委托给SQLScriptSource解析具体的SQL。\u003Cbr\u002F\u003E　　注：mybatis-velocity还提供了VelocityLanguageDriver和FreeMarkerLanguageDriver，可参见：\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli data-pid=\"rV7wYIju\"\u003E\u003Ca href=\"https:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fgithub.com\u002Fmybatis\u002Fvelocity-scripting\" class=\" external\" target=\"_blank\" rel=\"nofollow noreferrer\"\u003E\u003Cspan class=\"invisible\"\u003Ehttps:\u002F\u002F\u003C\u002Fspan\u003E\u003Cspan class=\"visible\"\u003Egithub.com\u002Fmybatis\u002Fvelo\u003C\u002Fspan\u003E\u003Cspan class=\"invisible\"\u003Ecity-scripting\u003C\u002Fspan\u003E\u003Cspan class=\"ellipsis\"\u003E\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003C\u002Fli\u003E\u003Cli data-pid=\"xSYRztAV\"\u003E\u003Ca href=\"https:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fgithub.com\u002Fmybatis\u002Ffreemarker-scripting\" class=\" external\" target=\"_blank\" rel=\"nofollow noreferrer\"\u003E\u003Cspan class=\"invisible\"\u003Ehttps:\u002F\u002F\u003C\u002Fspan\u003E\u003Cspan class=\"visible\"\u003Egithub.com\u002Fmybatis\u002Ffree\u003C\u002Fspan\u003E\u003Cspan class=\"invisible\"\u003Emarker-scripting\u003C\u002Fspan\u003E\u003Cspan class=\"ellipsis\"\u003E\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Ch3\u003E\u003Cb\u003E3.14 ResultMap\u003C\u002Fb\u003E\u003C\u002Fh3\u003E\u003Cp data-pid=\"CQdQqUxQ\"\u003E　　ResultMap类维护了每个标签中的详细信息，比如id映射、构造器映射、属性映射以及完整的映射列表、是否有嵌套的resultMap、是否有鉴别器、是否有嵌套查询，如下所示：\u003C\u002Fp\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003Epublic class ResultMap {\n  private Configuration configuration;\n\n  private String id;\n  private Class&lt;?&gt; type;\n  private List&lt;ResultMapping&gt; resultMappings;\n  private List&lt;ResultMapping&gt; idResultMappings;\n  private List&lt;ResultMapping&gt; constructorResultMappings;\n  private List&lt;ResultMapping&gt; propertyResultMappings;\n  private Set&lt;String&gt; mappedColumns;\n  private Set&lt;String&gt; mappedProperties;\n  private Discriminator discriminator;\n  private boolean hasNestedResultMaps;\n  private boolean hasNestedQueries;\n  private Boolean autoMapping;\n  ...\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp data-pid=\"APLpgtxz\"\u003E　　ResultMap除了作为一个ResultMap的数据结构表示外，本身并没有提供额外的功能。\u003C\u002Fp\u003E\u003Ch3\u003E\u003Cb\u003E3.15 ResultMapping\u003C\u002Fb\u003E\u003C\u002Fh3\u003E\u003Cp data-pid=\"zFjdcx9i\"\u003E　　ResultMapping代表下的映射，如下：\u003C\u002Fp\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003Epublic class ResultMapping {\n\n  private Configuration configuration;\n  private String property;\n  private String column;\n  private Class&lt;?&gt; javaType;\n  private JdbcType jdbcType;\n  private TypeHandler&lt;?&gt; typeHandler;\n  private String nestedResultMapId;\n  private String nestedQueryId;\n  private Set&lt;String&gt; notNullColumns;\n  private String columnPrefix;\n  \u002F\u002F 标记是否构造器属性，是否ID属性\n  private List&lt;ResultFlag&gt; flags;\n  private List&lt;ResultMapping&gt; composites;\n  private String resultSet;\n  private String foreignColumn;\n  private boolean lazy;\n  ...\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Ch3\u003E\u003Cb\u003E3.16 Discriminator\u003C\u002Fb\u003E\u003C\u002Fh3\u003E\u003Cp data-pid=\"kbquVeeg\"\u003E　　每个鉴别器节点都表示为一个Discriminator，如下所示：\u003C\u002Fp\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003Epublic class Discriminator {\n  \u002F\u002F 所属的属性节点&lt;result&gt;\n  private ResultMapping resultMapping;\n  \u002F\u002F 内部的if then映射\n  private Map&lt;String, String&gt; discriminatorMap;\n  ...\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp data-pid=\"1NU9Jmfd\"\u003E3.17 Configuration\u003Cbr\u002F\u003E　　Configuration是mybatis所有配置以及mapper文件的元数据容器。无论是解析mapper文件还是运行时执行SQL语句，都需要依赖与mybatis的环境和配置信息，比如databaseId、类型别名等。mybatis实现将所有这些信息封装到Configuration中并提供了一系列便利的接口方便各主要的调用方使用，这样就避免了各种配置和元数据信息到处散落的凌乱。\u003C\u002Fp\u003E\u003Cp data-pid=\"Vb4UtQu9\"\u003E3.18 ErrorContext\u003Cbr\u002F\u003E　　ErrorContext定义了一个mybatis内部统一的日志规范，记录了错误信息、发生错误涉及的资源文件、对象、逻辑过程、SQL语句以及出错原因，但是它不会影响运行，如下所示：\u003C\u002Fp\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003Epublic class ErrorContext {\n\n  private static final String LINE_SEPARATOR = System.getProperty(&#34;line.separator&#34;,&#34;\\n&#34;);\n  private static final ThreadLocal&lt;ErrorContext&gt; LOCAL = new ThreadLocal&lt;ErrorContext&gt;();\n\n  private ErrorContext stored;\n  private String resource;\n  private String activity;\n  private String object;\n  private String message;\n  private String sql;\n  private Throwable cause;\n\n  ...\n\n  public ErrorContext reset() {\n    resource = null;\n    activity = null;\n    object = null;\n    message = null;\n    sql = null;\n    cause = null;\n    LOCAL.remove();\n    return this;\n  }\n\n  @Override\n  public String toString() {\n    StringBuilder description = new StringBuilder();\n\n    \u002F\u002F message\n    if (this.message != null) {\n      description.append(LINE_SEPARATOR);\n      description.append(&#34;### &#34;);\n      description.append(this.message);\n    }\n\n    \u002F\u002F resource\n    if (resource != null) {\n      description.append(LINE_SEPARATOR);\n      description.append(&#34;### The error may exist in &#34;);\n      description.append(resource);\n    }\n\n    \u002F\u002F object\n    if (object != null) {\n      description.append(LINE_SEPARATOR);\n      description.append(&#34;### The error may involve &#34;);\n      description.append(object);\n    }\n\n    \u002F\u002F activity\n    if (activity != null) {\n      description.append(LINE_SEPARATOR);\n      description.append(&#34;### The error occurred while &#34;);\n      description.append(activity);\n    }\n\n    \u002F\u002F activity\n    if (sql != null) {\n      description.append(LINE_SEPARATOR);\n      description.append(&#34;### SQL: &#34;);\n      description.append(sql.replace(&#39;\\n&#39;, &#39; &#39;).replace(&#39;\\r&#39;, &#39; &#39;).replace(&#39;\\t&#39;, &#39; &#39;).trim());\n    }\n\n    \u002F\u002F cause\n    if (cause != null) {\n      description.append(LINE_SEPARATOR);\n      description.append(&#34;### Cause: &#34;);\n      description.append(cause.toString());\n    }\n\n    return description.toString();\n  }\n\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp data-pid=\"P6I-iKuf\"\u003E3.19 BoundSql\u003C\u002Fp\u003E\u003Cdiv class=\"highlight\"\u003E\u003Cpre\u003E\u003Ccode class=\"language-text\"\u003E\u002F**\n * An actual SQL String got from an {@link SqlSource} after having processed any dynamic content.\n * The SQL may have SQL placeholders &#34;?&#34; and an list (ordered) of an parameter mappings \n * with the additional information for each parameter (at least the property name of the input object to read \n * the value from). \n * &lt;\u002Fbr&gt;\n * Can also have additional parameters that are created by the dynamic language (for loops, bind...).\n *\n * SqlSource中包含的SQL处理动态内容之后的实际SQL语句，SQL中会包含?占位符，也就是最终给JDBC的SQL语句，以及他们的参数信息\n * @author Clinton Begin\n *\u002F\npublic class BoundSql {\n  \u002F\u002F sql文本\n  private final String sql;\n  \u002F\u002F 静态参数说明\n  private final List&lt;ParameterMapping&gt; parameterMappings;\n  \u002F\u002F 运行时参数对象\n  private final Object parameterObject;\n  \u002F\u002F 额外参数，也就是for loops、bind生成的\n  private final Map&lt;String, Object&gt; additionalParameters;\n  \u002F\u002F 额外参数的facade模式包装\n  private final MetaObject metaParameters;\n\n  public BoundSql(Configuration configuration, String sql, List&lt;ParameterMapping&gt; parameterMappings, Object parameterObject) {\n    this.sql = sql;\n    this.parameterMappings = parameterMappings;\n    this.parameterObject = parameterObject;\n    this.additionalParameters = new HashMap&lt;String, Object&gt;();\n    this.metaParameters = configuration.newMetaObject(additionalParameters);\n  }\n\n  public String getSql() {\n    return sql;\n  }\n\n  public List&lt;ParameterMapping&gt; getParameterMappings() {\n    return parameterMappings;\n  }\n\n  public Object getParameterObject() {\n    return parameterObject;\n  }\n\n  public boolean hasAdditionalParameter(String name) {\n    String paramName = new PropertyTokenizer(name).getName();\n    return additionalParameters.containsKey(paramName);\n  }\n\n  public void setAdditionalParameter(String name, Object value) {\n    metaParameters.setValue(name, value);\n  }\n\n  public Object getAdditionalParameter(String name) {\n    return metaParameters.getValue(name);\n  }\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E\u003C\u002Fp\u003E","adminClosedComment":false,"topics":[{"url":"https:\u002F\u002Fwww.zhihu.com\u002Fapi\u002Fv4\u002Ftopics\u002F19582744","type":"topic","id":"19582744","name":"Java 编程"},{"url":"https:\u002F\u002Fwww.zhihu.com\u002Fapi\u002Fv4\u002Ftopics\u002F19680218","type":"topic","id":"19680218","name":"MyBatis"},{"url":"https:\u002F\u002Fwww.zhihu.com\u002Fapi\u002Fv4\u002Ftopics\u002F19629329","type":"topic","id":"19629329","name":"Java 程序员"}],"voteupCount":1,"voting":0,"heavyUpStatus":"allow_heavy_up","column":{"description":"","canManage":false,"intro":"","isFollowing":false,"urlToken":"c_1101164296519720960","id":"c_1101164296519720960","articlesCount":169,"acceptSubmission":true,"title":"JAVA CTO之旅","url":"https:\u002F\u002Fzhuanlan.zhihu.com\u002Fc_1101164296519720960","commentPermission":"all","created":1555318026,"updated":1599163442,"imageUrl":"https:\u002F\u002Fpica.zhimg.com\u002F4b70deef7_720w.jpg?source=172ae18b","author":{"isFollowed":false,"avatarUrlTemplate":"https:\u002F\u002Fpic1.zhimg.com\u002Fv2-2856788095527eadbbc0dd5d521840f0.jpg?source=172ae18b","uid":"1065361307078983680","userType":"people","isFollowing":false,"urlToken":"yong-heng-zhi-hun","id":"f5930745493d322ed5f4c7af691e5e8d","description":"注重底层，第一性原理思考。","name":"永恒之魂","isAdvertiser":false,"headline":"道可道，非常道。","gender":1,"url":"\u002Fpeople\u002Ff5930745493d322ed5f4c7af691e5e8d","avatarUrl":"https:\u002F\u002Fpica.zhimg.com\u002Fv2-2856788095527eadbbc0dd5d521840f0_l.jpg?source=172ae18b","isOrg":false,"type":"people","badgeV2":{"title":"","mergedBadges":[],"detailBadges":[],"icon":"","nightIcon":""}},"followers":1039,"type":"column"},"commentCount":0,"contributions":[{"id":20926584,"state":"accepted","type":"first_publish","column":{"description":"","canManage":false,"intro":"","isFollowing":false,"urlToken":"c_1101164296519720960","id":"c_1101164296519720960","articlesCount":169,"acceptSubmission":true,"title":"JAVA CTO之旅","url":"https:\u002F\u002Fzhuanlan.zhihu.com\u002Fc_1101164296519720960","commentPermission":"all","created":1555318026,"updated":1599163442,"imageUrl":"https:\u002F\u002Fpica.zhimg.com\u002F4b70deef7_720w.jpg?source=172ae18b","author":{"isFollowed":false,"avatarUrlTemplate":"https:\u002F\u002Fpic1.zhimg.com\u002Fv2-2856788095527eadbbc0dd5d521840f0.jpg?source=172ae18b","uid":"1065361307078983680","userType":"people","isFollowing":false,"urlToken":"yong-heng-zhi-hun","id":"f5930745493d322ed5f4c7af691e5e8d","description":"注重底层，第一性原理思考。","name":"永恒之魂","isAdvertiser":false,"headline":"道可道，非常道。","gender":1,"url":"\u002Fpeople\u002Ff5930745493d322ed5f4c7af691e5e8d","avatarUrl":"https:\u002F\u002Fpica.zhimg.com\u002Fv2-2856788095527eadbbc0dd5d521840f0_l.jpg?source=172ae18b","isOrg":false,"type":"people","badgeV2":{"title":"","mergedBadges":[],"detailBadges":[],"icon":"","nightIcon":""}},"followers":1039,"type":"column"}}],"isTitleImageFullScreen":false,"upvotedFollowees":[],"commercialInfo":{"isCommercial":false,"plugin":{}},"suggestEdit":{"status":false,"reason":"","tip":"","url":"","title":""},"reason":"","annotationAction":[],"canTip":true,"tipjarorsCount":0,"isLabeled":false,"hasPublishingDraft":false,"isFavorited":false,"favlistsCount":14,"isNormal":true,"status":0,"activityToppingInfo":{"state":"untopped"},"shareText":"mybatis 3.x源码深度解析（五） - 来自知乎专栏「JAVA CTO之旅」，作者: 永恒之魂 https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F66984738 （想看更多？下载 @知乎 App：http:\u002F\u002Fweibo.com\u002Fp\u002F100404711598 ）","canComment":{"status":true,"reason":""},"mcnFpShow":-1,"isVisible":true,"isLiked":false,"likedCount":0,"hasColumn":true,"republishers":[],"isNewLinkCard":true,"emojiReaction":{"likeCount":0,"likeHasSet":false},"abParam":{"qaHiddenVoteup":"1","rsInterest1":""},"attachedInfo":"kgIjCgkxMDMwMTQxNDkSCDY2OTg0NzM4GAciCklNQUdFX1RFWFQ=","shareGuide":{"hasPositiveBubble":false,"hasTimeBubble":false,"hitShareGuideCluster":false},"settings":{"tableOfContents":{"enabled":false}},"canReference":false,"reactionInstruction":{},"entityWords":[{"name":"配置文件","mention":"配置文件","matchorder":1,"begin":20560,"end":20564,"entityid":7394550640524058000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Unknown","score":0.000986087610079447,"attachedInfoBytes":"sgJhCgzphY3nva7mlofku7YSB1Vua25vd24Y0KABINSgASgBNZw\u002FgTo6B2FydGljbGVAvrbL0JKUrs9mSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OfIC1QEKJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4ORoHYXJ0aWNsZSIJMTAzMDE0MTQ5OgzphY3nva7mlofku7ZAvrbL0JKUrs9mSABSF2JhaWR1LWJhaWtlLWl0ZW0tcmVjYWxsXZw\u002FgTpiYQoM6YWN572u5paH5Lu2EgdVbmtub3duGNCgASDUoAEoATWcP4E6OgdhcnRpY2xlQL62y9CSlK7PZkgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODk=","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"数据结构","mention":"数据结构","matchorder":1,"begin":43039,"end":43043,"entityid":8175049225066598000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Unknown","score":0.0007261994599663864,"attachedInfoBytes":"sgJhCgzmlbDmja7nu5PmnoQSB1Vua25vd24Yn9ACIKPQAigBNWxePjo6B2FydGljbGVAl6G1y8\u002F+5rlxSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OfIC3QEKJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4ORoHYXJ0aWNsZSIJMTAzMDE0MTQ5OgzmlbDmja7nu5PmnoRAl6G1y8\u002F+5rlxSAFSH25ld19iYWlkdS13aWtpcGVkaWEtaXRlbS1yZWNhbGxdbF4+OmJhCgzmlbDmja7nu5PmnoQSB1Vua25vd24Yn9ACIKPQAigBNWxePjo6B2FydGljbGVAl6G1y8\u002F+5rlxSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OQ==","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"计算机","mention":"计算机","matchorder":1,"begin":32333,"end":32336,"entityid":462716629209233500,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Computer","score":0.0005724483885142587,"attachedInfoBytes":"sgJfCgnorqHnrpfmnLoSCENvbXB1dGVyGM38ASDQ\u002FAEoATVcEBY6OgdhcnRpY2xlQNPwut2pyvm1BkgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODnyAssBCiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODkaB2FydGljbGUiCTEwMzAxNDE0OToJ6K6h566X5py6QNPwut2pyvm1BkgCUhJhaV9lbnRpdHlfcmVjYWxsZXJdXBAWOmJfCgnorqHnrpfmnLoSCENvbXB1dGVyGM38ASDQ\u002FAEoATVcEBY6OgdhcnRpY2xlQNPwut2pyvm1BkgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODk=","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"ognl表达式","mention":"ognl表达式","matchorder":1,"begin":14939,"end":14946,"entityid":-334707265062799940,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Math","score":0.0009782597230186818,"attachedInfoBytes":"sgJeCg1vZ25s6KGo6L6+5byPEgRNYXRoGNt0IOJ0KAE18ziAOjoHYXJ0aWNsZUDC68HRwLC4rfsBSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OfICzwEKJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4ORoHYXJ0aWNsZSIJMTAzMDE0MTQ5Og1vZ25s6KGo6L6+5byPQMLrwdHAsLit+wFIBFISYWlfZW50aXR5X3JlY2FsbGVyXfM4gDpiXgoNb2dubOihqOi+vuW8jxIETWF0aBjbdCDidCgBNfM4gDo6B2FydGljbGVAwuvB0cCwuK37AUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODk=","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"嵌套查询","mention":"嵌套查询","matchorder":1,"begin":42313,"end":42317,"entityid":-6473107604123119000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Unknown","score":0.0007890123081684876,"attachedInfoBytes":"sgJiCgzltYzlpZfmn6Xor6ISB1Vua25vd24YycoCIM3KAigBNbjVTjo6B2FydGljbGVAuajyuuHduZWmAUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODnyAtcBCiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODkaB2FydGljbGUiCTEwMzAxNDE0OToM5bWM5aWX5p+l6K+iQLmo8rrh3bmVpgFIBVIXYmFpZHUtYmFpa2UtaXRlbS1yZWNhbGxduNVOOmJiCgzltYzlpZfmn6Xor6ISB1Vua25vd24YycoCIM3KAigBNbjVTjo6B2FydGljbGVAuajyuuHduZWmAUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODk=","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"反射机制","mention":"反射机制","matchorder":1,"begin":31736,"end":31740,"entityid":-6370905655970062000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Unknown","score":0.000708452681476365,"attachedInfoBytes":"sgJiCgzlj43lsITmnLrliLYSB1Vua25vd24Y+PcBIPz3ASgBNXS3OTo6B2FydGljbGVAor6Cs\u002Ffh\u002F8qnAUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODnyAtcBCiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODkaB2FydGljbGUiCTEwMzAxNDE0OToM5Y+N5bCE5py65Yi2QKK+grP34f\u002FKpwFIBlIXYmFpZHUtYmFpa2UtaXRlbS1yZWNhbGxddLc5OmJiCgzlj43lsITmnLrliLYSB1Vua25vd24Y+PcBIPz3ASgBNXS3OTo6B2FydGljbGVAor6Cs\u002Ffh\u002F8qnAUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODk=","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"最终静态SQL语句","mention":"最终静态SQL语句","matchorder":1,"begin":1215,"end":1224,"entityid":-9211738544301529000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Computer","score":0.001448183662436528,"attachedInfoBytes":"sgJqChXmnIDnu4jpnZnmgIFTUUzor63lj6USCENvbXB1dGVyGL8JIMgJKAE1+9C9OjoHYXJ0aWNsZUCbz4j5mJPVlIABSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OfIC4wEKJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4ORoHYXJ0aWNsZSIJMTAzMDE0MTQ5OhXmnIDnu4jpnZnmgIFTUUzor63lj6VAm8+I+ZiT1ZSAAUgHUhJhaV9lbnRpdHlfcmVjYWxsZXJd+9C9OmJqChXmnIDnu4jpnZnmgIFTUUzor63lj6USCENvbXB1dGVyGL8JIMgJKAE1+9C9OjoHYXJ0aWNsZUCbz4j5mJPVlIABSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OQ==","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"frch_item_0=1","mention":"frch_item_0=1","matchorder":1,"begin":21401,"end":21414,"entityid":-6326885115369591000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Math","score":0.0022136629014958276,"attachedInfoBytes":"sgJgCg1mcmNoX2l0ZW1fMD0xEgRNYXRoGJmnASCmpwEoATUaExE7OgdhcnRpY2xlQPDiwZ2k8JiZqAFIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg58gLRAQokMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5GgdhcnRpY2xlIgkxMDMwMTQxNDk6DWZyY2hfaXRlbV8wPTFA8OLBnaTwmJmoAUgIUhJhaV9lbnRpdHlfcmVjYWxsZXJdGhMRO2JgCg1mcmNoX2l0ZW1fMD0xEgRNYXRoGJmnASCmpwEoATUaExE7OgdhcnRpY2xlQPDiwZ2k8JiZqAFIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"static","mention":"static","matchorder":9,"begin":2899,"end":2905,"entityid":-2840653805531720700,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Math","score":0.0016596766398701002,"attachedInfoBytes":"sgJXCgZzdGF0aWMSBE1hdGgY0xYg2RYoCTWCidk6OgdhcnRpY2xlQNCorvugjf7J2AFIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg58gLBAQokMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5GgdhcnRpY2xlIgkxMDMwMTQxNDk6BnN0YXRpY0DQqK77oI3+ydgBSAlSEmFpX2VudGl0eV9yZWNhbGxlcl2Cidk6YlcKBnN0YXRpYxIETWF0aBjTFiDZFigJNYKJ2To6B2FydGljbGVA0Kiu+6CN\u002FsnYAUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODk=","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"context","mention":"context","matchorder":16,"begin":2423,"end":2430,"entityid":4580343971219113000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Math","score":0.001539792561157799,"attachedInfoBytes":"sgJXCgdjb250ZXh0EgRNYXRoGPcSIP4SKBA13dLJOjoHYXJ0aWNsZUCciPjMr9KpyD9IAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg58gLBAQokMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5GgdhcnRpY2xlIgkxMDMwMTQxNDk6B2NvbnRleHRAnIj4zK\u002FSqcg\u002FSApSEmFpX2VudGl0eV9yZWNhbGxlcl3d0sk6YlcKB2NvbnRleHQSBE1hdGgY9xIg\u002FhIoEDXd0sk6OgdhcnRpY2xlQJyI+Myv0qnIP0gAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODk=","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"sql.length","mention":"sql.length","matchorder":2,"begin":19517,"end":19527,"entityid":1373379210767651000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Math","score":0.0014441037098575776,"attachedInfoBytes":"sgJcCgpzcWwubGVuZ3RoEgRNYXRoGL2YASDHmAEoAjUUSL06OgdhcnRpY2xlQOmi2f3Zo86HE0gAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODnyAskBCiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODkaB2FydGljbGUiCTEwMzAxNDE0OToKc3FsLmxlbmd0aEDpotn92aPOhxNIC1ISYWlfZW50aXR5X3JlY2FsbGVyXRRIvTpiXAoKc3FsLmxlbmd0aBIETWF0aBi9mAEgx5gBKAI1FEi9OjoHYXJ0aWNsZUDpotn92aPOhxNIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"overrides","mention":"overrides","matchorder":3,"begin":16860,"end":16869,"entityid":-8260291320119555000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Math","score":0.0011106595849536965,"attachedInfoBytes":"sgJcCglvdmVycmlkZXMSBE1hdGgY3IMBIOWDASgDNY2TkTo6B2FydGljbGVA1Jeg2PKZ466NAUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODnyAskBCiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODkaB2FydGljbGUiCTEwMzAxNDE0OToJb3ZlcnJpZGVzQNSXoNjymeOujQFIDFISYWlfZW50aXR5X3JlY2FsbGVyXY2TkTpiXAoJb3ZlcnJpZGVzEgRNYXRoGNyDASDlgwEoAzWNk5E6OgdhcnRpY2xlQNSXoNjymeOujQFIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"boolean","mention":"boolean","matchorder":27,"begin":2394,"end":2401,"entityid":-963446954507535100,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Music","score":0.0009871947690353877,"attachedInfoBytes":"sgJZCgdib29sZWFuEgVNdXNpYxjaEiDhEigbNcJkgTo6B2FydGljbGVApvqVpZfDydDyAUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODnyAsQBCiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODkaB2FydGljbGUiCTEwMzAxNDE0OToHYm9vbGVhbkCm+pWll8PJ0PIBSA1SEmFpX2VudGl0eV9yZWNhbGxlcl3CZIE6YlkKB2Jvb2xlYW4SBU11c2ljGNoSIOESKBs1wmSBOjoHYXJ0aWNsZUCm+pWll8PJ0PIBSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OQ==","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"条件表达式","mention":"条件表达式","matchorder":1,"begin":9156,"end":9161,"entityid":-3715943471050660000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Unknown","score":0.0006938836170614776,"attachedInfoBytes":"sgJjCg\u002FmnaHku7booajovr7lvI8SB1Vua25vd24YxEcgyUcoATW+5TU6OgdhcnRpY2xlQJrP39Sdo5S3zAFIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg58gLbAQokMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5GgdhcnRpY2xlIgkxMDMwMTQxNDk6D+adoeS7tuihqOi+vuW8j0Caz9\u002FUnaOUt8wBSA5SF2JhaWR1LWJhaWtlLWl0ZW0tcmVjYWxsXb7lNTpiYwoP5p2h5Lu26KGo6L6+5byPEgdVbmtub3duGMRHIMlHKAE1vuU1OjoHYXJ0aWNsZUCaz9\u002FUnaOUt8wBSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OQ==","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"public interface","mention":"public interface","matchorder":7,"begin":574,"end":590,"entityid":5882774449699289000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Computer","score":0.0031802257570776593,"attachedInfoBytes":"sgJkChBwdWJsaWMgaW50ZXJmYWNlEghDb21wdXRlchi+BCDOBCgHNVZrUDs6B2FydGljbGVAgO7HwJmG9NFRSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OfIC1wEKJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4ORoHYXJ0aWNsZSIJMTAzMDE0MTQ5OhBwdWJsaWMgaW50ZXJmYWNlQIDux8CZhvTRUUgPUhJhaV9lbnRpdHlfcmVjYWxsZXJdVmtQO2JkChBwdWJsaWMgaW50ZXJmYWNlEghDb21wdXRlchi+BCDOBCgHNVZrUDs6B2FydGljbGVAgO7HwJmG9NFRSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OQ==","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"ObjectWrapper类","mention":"ObjectWrapper类","matchorder":1,"begin":26280,"end":26294,"entityid":-6796821072772830000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"OtherTerm","score":0.002050464268376795,"attachedInfoBytes":"sgJoChBPYmplY3RXcmFwcGVy57G7EglPdGhlclRlcm0YqM0BILbNASgBNRVhBjs6B2FydGljbGVAl9bxm+3ntdahAUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODnyAtwBCiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODkaB2FydGljbGUiCTEwMzAxNDE0OToQT2JqZWN0V3JhcHBlcuexu0CX1vGb7ee11qEBSBBSEmFpX2VudGl0eV9yZWNhbGxlcl0VYQY7YmgKEE9iamVjdFdyYXBwZXLnsbsSCU90aGVyVGVybRiozQEgts0BKAE1FWEGOzoHYXJ0aWNsZUCX1vGb7ee11qEBSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OQ==","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"解析注解","mention":"解析注解","matchorder":1,"begin":40424,"end":40428,"entityid":3373247014269811000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Math","score":0.001513901346586466,"attachedInfoBytes":"sgJeCgzop6PmnpDms6jop6MSBE1hdGgY6LsCIOy7AigBNRpuxjo6B2FydGljbGVAgfXLyZjJi+guSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OfICzQEKJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4ORoHYXJ0aWNsZSIJMTAzMDE0MTQ5Ogzop6PmnpDms6jop6NAgfXLyZjJi+guSBFSEmFpX2VudGl0eV9yZWNhbGxlcl0absY6Yl4KDOino+aekOazqOinoxIETWF0aBjouwIg7LsCKAE1Gm7GOjoHYXJ0aWNsZUCB9cvJmMmL6C5IAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"delegate","mention":"delegate","matchorder":13,"begin":6236,"end":6244,"entityid":1015990072379107800,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Math","score":0.0013050687255174998,"attachedInfoBytes":"sgJYCghkZWxlZ2F0ZRIETWF0aBjcMCDkMCgNNdcOqzo6B2FydGljbGVAitTr++ey4YwOSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OfICwwEKJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4ORoHYXJ0aWNsZSIJMTAzMDE0MTQ5OghkZWxlZ2F0ZUCK1Ov757LhjA5IElISYWlfZW50aXR5X3JlY2FsbGVyXdcOqzpiWAoIZGVsZWdhdGUSBE1hdGgY3DAg5DAoDTXXDqs6OgdhcnRpY2xlQIrU6\u002FvnsuGMDkgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODk=","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"包装器","mention":"包装器","matchorder":4,"begin":24486,"end":24489,"entityid":-1636745003104695600,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Computer","score":0.0007463480276311968,"attachedInfoBytes":"sgJgCgnljIXoo4XlmagSCENvbXB1dGVyGKa\u002FASCpvwEoBDWRpkM6OgdhcnRpY2xlQNqVsvD2osek6QFIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg58gLNAQokMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5GgdhcnRpY2xlIgkxMDMwMTQxNDk6CeWMheijheWZqEDalbLw9qLHpOkBSBNSEmFpX2VudGl0eV9yZWNhbGxlcl2RpkM6YmAKCeWMheijheWZqBIIQ29tcHV0ZXIYpr8BIKm\u002FASgENZGmQzo6B2FydGljbGVA2pWy8Paix6TpAUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODk=","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"构造器","mention":"构造器","matchorder":1,"begin":21461,"end":21464,"entityid":-8369790528625789000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Unknown","score":0.0005843603071745609,"attachedInfoBytes":"sgJfCgnmnoTpgKDlmagSB1Vua25vd24Y1acBINinASgBNcIvGTo6B2FydGljbGVAx\u002FLSxr\u002F7oeyLAUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODnyAtEBCiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODkaB2FydGljbGUiCTEwMzAxNDE0OToJ5p6E6YCg5ZmoQMfy0sa\u002F+6HsiwFIFFIXYmFpZHUtYmFpa2UtaXRlbS1yZWNhbGxdwi8ZOmJfCgnmnoTpgKDlmagSB1Vua25vd24Y1acBINinASgBNcIvGTo6B2FydGljbGVAx\u002FLSxr\u002F7oeyLAUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODk=","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"SQL","mention":"SQL","matchorder":22,"begin":411,"end":414,"entityid":2890893791734367700,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Math","score":0.0005189604688368224,"attachedInfoBytes":"sgJTCgNTUUwSBE1hdGgYmwMgngMoFjXZCgg6OgdhcnRpY2xlQK+K1p3kkqGPKEgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODnyArkBCiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODkaB2FydGljbGUiCTEwMzAxNDE0OToDU1FMQK+K1p3kkqGPKEgVUhJhaV9lbnRpdHlfcmVjYWxsZXJd2QoIOmJTCgNTUUwSBE1hdGgYmwMgngMoFjXZCgg6OgdhcnRpY2xlQK+K1p3kkqGPKEgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODk=","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"表达式执行器","mention":"表达式执行器","matchorder":1,"begin":9115,"end":9121,"entityid":4003932354495600600,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Computer","score":0.0008469014293324053,"attachedInfoBytes":"sgJmChLooajovr7lvI\u002FmiafooYzlmagSCENvbXB1dGVyGJtHIKFHKAE1mAJeOjoHYXJ0aWNsZUCasJ3zs+i0yDdIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg58gLbAQokMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5GgdhcnRpY2xlIgkxMDMwMTQxNDk6EuihqOi+vuW8j+aJp+ihjOWZqECasJ3zs+i0yDdIF1ISYWlfZW50aXR5X3JlY2FsbGVyXZgCXjpiZgoS6KGo6L6+5byP5omn6KGM5ZmoEghDb21wdXRlchibRyChRygBNZgCXjo6B2FydGljbGVAmrCd87PotMg3SABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OQ==","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"下划线","mention":"下划线","matchorder":1,"begin":25815,"end":25818,"entityid":-6482638383687316000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Math","score":0.000636960490151571,"attachedInfoBytes":"sgJcCgnkuIvliJLnur8SBE1hdGgY18kBINrJASgBNbL5Jjo6B2FydGljbGVAgpeF6MjXwoSmAUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODnyAskBCiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODkaB2FydGljbGUiCTEwMzAxNDE0OToJ5LiL5YiS57q\u002FQIKXhejI18KEpgFIGVISYWlfZW50aXR5X3JlY2FsbGVyXbL5JjpiXAoJ5LiL5YiS57q\u002FEgRNYXRoGNfJASDayQEoATWy+SY6OgdhcnRpY2xlQIKXhejI18KEpgFIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"硬编码","mention":"硬编码","matchorder":1,"begin":21465,"end":21468,"entityid":-2215678415491353600,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Computer","score":0.0006272545922861097,"attachedInfoBytes":"sgJgCgnnoaznvJbnoIESCENvbXB1dGVyGNmnASDcpwEoATVYbiQ6OgdhcnRpY2xlQLbojKGGh5Wg4QFIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg58gLNAQokMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5GgdhcnRpY2xlIgkxMDMwMTQxNDk6CeehrOe8lueggUC26IyhhoeVoOEBSBpSEmFpX2VudGl0eV9yZWNhbGxlcl1YbiQ6YmAKCeehrOe8lueggRIIQ29tcHV0ZXIY2acBINynASgBNVhuJDo6B2FydGljbGVAtuiMoYaHlaDhAUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODk=","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"子类","mention":"子类","matchorder":2,"begin":20642,"end":20644,"entityid":-7838639918111045000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Math","score":0.0005190963692934319,"attachedInfoBytes":"sgJZCgblrZDnsbsSBE1hdGgYoqEBIKShASgCNfgTCDo6B2FydGljbGVAxpet9ufQ45uTAUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODnyAsMBCiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODkaB2FydGljbGUiCTEwMzAxNDE0OToG5a2Q57G7QMaXrfbn0OObkwFIG1ISYWlfZW50aXR5X3JlY2FsbGVyXfgTCDpiWQoG5a2Q57G7EgRNYXRoGKKhASCkoQEoAjX4Ewg6OgdhcnRpY2xlQMaXrfbn0OObkwFIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"数据库","mention":"数据库","matchorder":1,"begin":540,"end":543,"entityid":2020349860118997500,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Math","score":0.0008523838912139117,"attachedInfoBytes":"sgJZCgnmlbDmja7lupMSBE1hdGgYnAQgnwQoATWEcl86OgdhcnRpY2xlQKrUnLPlr+6EHEgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODnyAsUBCiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODkaB2FydGljbGUiCTEwMzAxNDE0OToJ5pWw5o2u5bqTQKrUnLPlr+6EHEgcUhJhaV9lbnRpdHlfcmVjYWxsZXJdhHJfOmJZCgnmlbDmja7lupMSBE1hdGgYnAQgnwQoATWEcl86OgdhcnRpY2xlQKrUnLPlr+6EHEgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODk=","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"mapper文件","mention":"mapper文件","matchorder":2,"begin":20565,"end":20573,"entityid":-7473519941257527000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Computer","score":0.0013793601963476287,"attachedInfoBytes":"sgJjCgxtYXBwZXLmlofku7YSCENvbXB1dGVyGNWgASDdoAEoAjWmy7Q6OgdhcnRpY2xlQLz+r7zbpq6kmAFIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg58gLTAQokMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5GgdhcnRpY2xlIgkxMDMwMTQxNDk6DG1hcHBlcuaWh+S7tkC8\u002Fq+826aupJgBSB1SEmFpX2VudGl0eV9yZWNhbGxlcl2my7Q6YmMKDG1hcHBlcuaWh+S7thIIQ29tcHV0ZXIY1aABIN2gASgCNabLtDo6B2FydGljbGVAvP6vvNumrqSYAUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODk=","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"annotation","mention":"annotation","matchorder":3,"begin":380,"end":390,"entityid":-1539489121149147600,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Medical","score":0.0012058052603624442,"attachedInfoBytes":"sgJeCgphbm5vdGF0aW9uEgdNZWRpY2FsGPwCIIYDKAM1HAyeOjoHYXJ0aWNsZUCZzM6y0Nmo0eoBSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OfICzAEKJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4ORoHYXJ0aWNsZSIJMTAzMDE0MTQ5Ogphbm5vdGF0aW9uQJnMzrLQ2ajR6gFIHlISYWlfZW50aXR5X3JlY2FsbGVyXRwMnjpiXgoKYW5ub3RhdGlvbhIHTWVkaWNhbBj8AiCGAygDNRwMnjo6B2FydGljbGVAmczOstDZqNHqAUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODk=","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"序列机制","mention":"序列机制","matchorder":1,"begin":35283,"end":35287,"entityid":3662862586532785700,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"OtherTerm","score":0.000702799749202029,"attachedInfoBytes":"sgJjCgzluo\u002FliJfmnLrliLYSCU90aGVyVGVybRjTkwIg15MCKAE1GDw4OjoHYXJ0aWNsZUDw3Oua2sPG6jJIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg58gLSAQokMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5GgdhcnRpY2xlIgkxMDMwMTQxNDk6DOW6j+WIl+acuuWItkDw3Oua2sPG6jJIIFISYWlfZW50aXR5X3JlY2FsbGVyXRg8ODpiYwoM5bqP5YiX5py65Yi2EglPdGhlclRlcm0Y05MCINeTAigBNRg8ODo6B2FydGljbGVA8NzrmtrDxuoySABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OQ==","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"sql.append","mention":"sql.append","matchorder":1,"begin":19731,"end":19741,"entityid":4887824565837586000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Math","score":0.0018672241023602876,"attachedInfoBytes":"sgJcCgpzcWwuYXBwZW5kEgRNYXRoGJOaASCdmgEoATWlvfQ6OgdhcnRpY2xlQNLBtdm70cLqQ0gAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODnyAskBCiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODkaB2FydGljbGUiCTEwMzAxNDE0OToKc3FsLmFwcGVuZEDSwbXZu9HC6kNIIVISYWlfZW50aXR5X3JlY2FsbGVyXaW99DpiXAoKc3FsLmFwcGVuZBIETWF0aBiTmgEgnZoBKAE1pb30OjoHYXJ0aWNsZUDSwbXZu9HC6kNIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"单向链表","mention":"单向链表","matchorder":1,"begin":1742,"end":1746,"entityid":8096314091011468000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Computer","score":0.0007582898419465495,"attachedInfoBytes":"sgJgCgzljZXlkJHpk77ooagSCENvbXB1dGVyGM4NININKAE1+MdGOjoHYXJ0aWNsZUCw2OnF0Nj4rXBIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg58gLPAQokMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5GgdhcnRpY2xlIgkxMDMwMTQxNDk6DOWNleWQkemTvuihqECw2OnF0Nj4rXBIIlISYWlfZW50aXR5X3JlY2FsbGVyXfjHRjpiYAoM5Y2V5ZCR6ZO+6KGoEghDb21wdXRlchjODSDSDSgBNfjHRjo6B2FydGljbGVAsNjpxdDY+K1wSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OQ==","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"骨架代码","mention":"骨架代码","matchorder":1,"begin":22976,"end":22980,"entityid":-9221930627307059000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Computer","score":0.001032889274982806,"attachedInfoBytes":"sgJjCgzpqqjmnrbku6PnoIESCENvbXB1dGVyGMCzASDEswEoATUDYoc6OgdhcnRpY2xlQJ+SxYDF3seCgAFIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg58gLTAQokMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5GgdhcnRpY2xlIgkxMDMwMTQxNDk6DOmqqOaetuS7o+eggUCfksWAxd7HgoABSCNSEmFpX2VudGl0eV9yZWNhbGxlcl0DYoc6YmMKDOmqqOaetuS7o+eggRIIQ29tcHV0ZXIYwLMBIMSzASgBNQNihzo6B2FydGljbGVAn5LFgMXex4KAAUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODk=","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"参数处理器","mention":"参数处理器","matchorder":1,"begin":39897,"end":39902,"entityid":-8161128552039652000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Computer","score":0.0006964854714268821,"attachedInfoBytes":"sgJmCg\u002Flj4LmlbDlpITnkIblmagSCENvbXB1dGVyGNm3AiDetwIoATVZlDY6OgdhcnRpY2xlQIrJg8ukmvbejgFIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg58gLZAQokMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5GgdhcnRpY2xlIgkxMDMwMTQxNDk6D+WPguaVsOWkhOeQhuWZqECKyYPLpJr23o4BSCRSEmFpX2VudGl0eV9yZWNhbGxlcl1ZlDY6YmYKD+WPguaVsOWkhOeQhuWZqBIIQ29tcHV0ZXIY2bcCIN63AigBNVmUNjo6B2FydGljbGVAismDy6Sa9t6OAUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODk=","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"parse方法","mention":"parse方法","matchorder":1,"begin":20698,"end":20705,"entityid":-5131637524831684000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Math","score":0.0015778526791478398,"attachedInfoBytes":"sgJeCgtwYXJzZeaWueazlRIETWF0aBjaoQEg4aEBKAE188\u002FOOjoHYXJ0aWNsZUC7+d7Cwduw5LgBSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OfICzQEKJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4ORoHYXJ0aWNsZSIJMTAzMDE0MTQ5OgtwYXJzZeaWueazlUC7+d7Cwduw5LgBSCVSEmFpX2VudGl0eV9yZWNhbGxlcl3zz846Yl4KC3BhcnNl5pa55rOVEgRNYXRoGNqhASDhoQEoATXzz846OgdhcnRpY2xlQLv53sLB27DkuAFIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"properties","mention":"properties","matchorder":1,"begin":30710,"end":30720,"entityid":8553422259894191000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Medical","score":0.0014913048964308173,"attachedInfoBytes":"sgJfCgpwcm9wZXJ0aWVzEgdNZWRpY2FsGPbvASCA8AEoATXkd8M6OgdhcnRpY2xlQImHprejh\u002FfZdkgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODnyAswBCiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODkaB2FydGljbGUiCTEwMzAxNDE0OToKcHJvcGVydGllc0CJh6a3o4f32XZIJlISYWlfZW50aXR5X3JlY2FsbGVyXeR3wzpiXwoKcHJvcGVydGllcxIHTWVkaWNhbBj27wEggPABKAE15HfDOjoHYXJ0aWNsZUCJh6a3o4f32XZIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"迭代器","mention":"迭代器","matchorder":1,"begin":3904,"end":3907,"entityid":-316952798769198140,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Computer","score":0.0009785395620323309,"attachedInfoBytes":"sgJeCgnov63ku6PlmagSCENvbXB1dGVyGMAeIMMeKAE1V0KAOjoHYXJ0aWNsZUDZl6\u002FWvaP9zPsBSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OfICywEKJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4ORoHYXJ0aWNsZSIJMTAzMDE0MTQ5Ognov63ku6PlmahA2Zev1r2j\u002Fcz7AUgnUhJhaV9lbnRpdHlfcmVjYWxsZXJdV0KAOmJeCgnov63ku6PlmagSCENvbXB1dGVyGMAeIMMeKAE1V0KAOjoHYXJ0aWNsZUDZl6\u002FWvaP9zPsBSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OQ==","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"构造函数","mention":"构造函数","matchorder":2,"begin":31758,"end":31762,"entityid":-8502803870457382000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Computer","score":0.0007508486431334234,"attachedInfoBytes":"sgJjCgzmnoTpgKDlh73mlbASCENvbXB1dGVyGI74ASCS+AEoAjWZ1EQ6OgdhcnRpY2xlQOX5yNTfnf7\u002FiQFIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg58gLTAQokMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5GgdhcnRpY2xlIgkxMDMwMTQxNDk6DOaehOmAoOWHveaVsEDl+cjU353+\u002F4kBSChSEmFpX2VudGl0eV9yZWNhbGxlcl2Z1EQ6YmMKDOaehOmAoOWHveaVsBIIQ29tcHV0ZXIYjvgBIJL4ASgCNZnURDo6B2FydGljbGVA5fnI1N+d\u002Fv+JAUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODk=","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"占位符","mention":"占位符","matchorder":1,"begin":22119,"end":22122,"entityid":2000819593731956700,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Math","score":0.0006378424387647741,"attachedInfoBytes":"sgJbCgnljaDkvY3nrKYSBE1hdGgY56wBIOqsASgBNeI0Jzo6B2FydGljbGVAsb+jwJ3aleIbSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OfICxwEKJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4ORoHYXJ0aWNsZSIJMTAzMDE0MTQ5OgnljaDkvY3nrKZAsb+jwJ3aleIbSClSEmFpX2VudGl0eV9yZWNhbGxlcl3iNCc6YlsKCeWNoOS9jeesphIETWF0aBjnrAEg6qwBKAE14jQnOjoHYXJ0aWNsZUCxv6PAndqV4htIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"动态标签","mention":"动态标签","matchorder":5,"begin":1339,"end":1343,"entityid":2996212997754209300,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Computer","score":0.0006326645271825899,"attachedInfoBytes":"sgJgCgzliqjmgIHmoIfnrb4SCENvbXB1dGVyGLsKIL8KKAU1ZtklOjoHYXJ0aWNsZUDRibHUjPuryilIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg58gLPAQokMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5GgdhcnRpY2xlIgkxMDMwMTQxNDk6DOWKqOaAgeagh+etvkDRibHUjPuryilIKlISYWlfZW50aXR5X3JlY2FsbGVyXWbZJTpiYAoM5Yqo5oCB5qCH562+EghDb21wdXRlchi7CiC\u002FCigFNWbZJTo6B2FydGljbGVA0Ymx1Iz7q8opSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OQ==","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"frch_index_1=1","mention":"frch_index_1=1","matchorder":1,"begin":21273,"end":21287,"entityid":2719340209550796000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Math","score":0.001830764117713768,"attachedInfoBytes":"sgJgCg5mcmNoX2luZGV4XzE9MRIETWF0aBiZpgEgp6YBKAE1QPbvOjoHYXJ0aWNsZUDdyNjttLDC3iVIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg58gLRAQokMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5GgdhcnRpY2xlIgkxMDMwMTQxNDk6DmZyY2hfaW5kZXhfMT0xQN3I2O20sMLeJUgrUhJhaV9lbnRpdHlfcmVjYWxsZXJdQPbvOmJgCg5mcmNoX2luZGV4XzE9MRIETWF0aBiZpgEgp6YBKAE1QPbvOjoHYXJ0aWNsZUDdyNjttLDC3iVIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"evaluator","mention":"evaluator","matchorder":2,"begin":2989,"end":2998,"entityid":4485761361981510700,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Medical","score":0.0016239759594827777,"attachedInfoBytes":"sgJcCglldmFsdWF0b3ISB01lZGljYWwYrRcgthcoAjWX29Q6OgdhcnRpY2xlQNCn0oCThqigPkgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODnyAsgBCiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODkaB2FydGljbGUiCTEwMzAxNDE0OToJZXZhbHVhdG9yQNCn0oCThqigPkgsUhJhaV9lbnRpdHlfcmVjYWxsZXJdl9vUOmJcCglldmFsdWF0b3ISB01lZGljYWwYrRcgthcoAjWX29Q6OgdhcnRpY2xlQNCn0oCThqigPkgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODk=","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"枚举类型","mention":"枚举类型","matchorder":1,"begin":22343,"end":22347,"entityid":8163928871698962000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Computer","score":0.0009692889411368338,"attachedInfoBytes":"sgJiCgzmnprkuL7nsbvlnosSCENvbXB1dGVyGMeuASDLrgEoATXhF346OgdhcnRpY2xlQNetsInfwYamcUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODnyAtEBCiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODkaB2FydGljbGUiCTEwMzAxNDE0OToM5p6a5Li+57G75Z6LQNetsInfwYamcUgtUhJhaV9lbnRpdHlfcmVjYWxsZXJd4Rd+OmJiCgzmnprkuL7nsbvlnosSCENvbXB1dGVyGMeuASDLrgEoATXhF346OgdhcnRpY2xlQNetsInfwYamcUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODk=","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"驼峰式","mention":"驼峰式","matchorder":1,"begin":29852,"end":29855,"entityid":-1990517309046783000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"OtherTerm","score":0.0007776164808844035,"attachedInfoBytes":"sgJhCgnpqbzls7DlvI8SCU90aGVyVGVybRic6QEgn+kBKAE19dhLOjoHYXJ0aWNsZUCkiIDY2+GQsOQBSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OfICzgEKJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4ORoHYXJ0aWNsZSIJMTAzMDE0MTQ5Ognpqbzls7DlvI9ApIiA2NvhkLDkAUguUhJhaV9lbnRpdHlfcmVjYWxsZXJd9dhLOmJhCgnpqbzls7DlvI8SCU90aGVyVGVybRic6QEgn+kBKAE19dhLOjoHYXJ0aWNsZUCkiIDY2+GQsOQBSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OQ==","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"角度","mention":"角度","matchorder":1,"begin":20095,"end":20097,"entityid":-6838710407456919000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Math","score":0.0007140557713921011,"attachedInfoBytes":"sgJZCgbop5LluqYSBE1hdGgY\u002F5wBIIGdASgBNXkvOzo6B2FydGljbGVAteeNjuGjgYyhAUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODnyAsMBCiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODkaB2FydGljbGUiCTEwMzAxNDE0OToG6KeS5bqmQLXnjY7ho4GMoQFIL1ISYWlfZW50aXR5X3JlY2FsbGVyXXkvOzpiWQoG6KeS5bqmEgRNYXRoGP+cASCBnQEoATV5Lzs6OgdhcnRpY2xlQLXnjY7ho4GMoQFIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"primitives","mention":"primitives","matchorder":1,"begin":10746,"end":10756,"entityid":4962248474536664000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Medical","score":0.0025123522442680457,"attachedInfoBytes":"sgJdCgpwcmltaXRpdmVzEgdNZWRpY2FsGPpTIIRUKAE1R6YkOzoHYXJ0aWNsZUDFte3fpNbc7kRIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg58gLKAQokMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5GgdhcnRpY2xlIgkxMDMwMTQxNDk6CnByaW1pdGl2ZXNAxbXt36TW3O5ESDBSEmFpX2VudGl0eV9yZWNhbGxlcl1HpiQ7Yl0KCnByaW1pdGl2ZXMSB01lZGljYWwY+lMghFQoATVHpiQ7OgdhcnRpY2xlQMW17d+k1tzuREgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODk=","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"configuration","mention":"configuration","matchorder":19,"begin":3261,"end":3274,"entityid":8814999502781054000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Medical","score":0.0017342925015099708,"attachedInfoBytes":"sgJgCg1jb25maWd1cmF0aW9uEgdNZWRpY2FsGL0ZIMoZKBM1M1HjOjoHYXJ0aWNsZUDd+4nUgOvKqnpIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg58gLQAQokMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5GgdhcnRpY2xlIgkxMDMwMTQxNDk6DWNvbmZpZ3VyYXRpb25A3fuJ1IDryqp6SDFSEmFpX2VudGl0eV9yZWNhbGxlcl0zUeM6YmAKDWNvbmZpZ3VyYXRpb24SB01lZGljYWwYvRkgyhkoEzUzUeM6OgdhcnRpY2xlQN37idSA68qqekgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODk=","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"额外参数","mention":"额外参数","matchorder":1,"begin":21032,"end":21036,"entityid":6410546484393203000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"OtherTerm","score":0.0006274627473253653,"attachedInfoBytes":"sgJjCgzpop3lpJblj4LmlbASCU90aGVyVGVybRiopAEgrKQBKAE1UHwkOjoHYXJ0aWNsZUCdpYuTgsK1+1hIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg58gLSAQokMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5GgdhcnRpY2xlIgkxMDMwMTQxNDk6DOmineWkluWPguaVsECdpYuTgsK1+1hIMlISYWlfZW50aXR5X3JlY2FsbGVyXVB8JDpiYwoM6aKd5aSW5Y+C5pWwEglPdGhlclRlcm0YqKQBIKykASgBNVB8JDo6B2FydGljbGVAnaWLk4LCtftYSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OQ==","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"element","mention":"element","matchorder":1,"begin":26944,"end":26951,"entityid":6594341220982916000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Math","score":0.0020969867450409685,"attachedInfoBytes":"sgJZCgdlbGVtZW50EgRNYXRoGMDSASDH0gEoATWZbQk7OgdhcnRpY2xlQNKInKPvzPPBW0gAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODnyAsMBCiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODkaB2FydGljbGUiCTEwMzAxNDE0OToHZWxlbWVudEDSiJyj78zzwVtIM1ISYWlfZW50aXR5X3JlY2FsbGVyXZltCTtiWQoHZWxlbWVudBIETWF0aBjA0gEgx9IBKAE1mW0JOzoHYXJ0aWNsZUDSiJyj78zzwVtIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"frch_index_0=0","mention":"frch_index_0=0","matchorder":1,"begin":21245,"end":21259,"entityid":-7843626785761565000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Math","score":0.0018623721135113125,"attachedInfoBytes":"sgJhCg5mcmNoX2luZGV4XzA9MBIETWF0aBj9pQEgi6YBKAE11xr0OjoHYXJ0aWNsZUDTz8Wf7t\u002F1kpMBSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OfIC0wEKJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4ORoHYXJ0aWNsZSIJMTAzMDE0MTQ5Og5mcmNoX2luZGV4XzA9MEDTz8Wf7t\u002F1kpMBSDRSEmFpX2VudGl0eV9yZWNhbGxlcl3XGvQ6YmEKDmZyY2hfaW5kZXhfMD0wEgRNYXRoGP2lASCLpgEoATXXGvQ6OgdhcnRpY2xlQNPPxZ\u002Fu3\u002FWSkwFIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"继承BeanWrapper","mention":"继承BeanWrapper","matchorder":1,"begin":27081,"end":27094,"entityid":53120111958963310,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Math","score":0.001786845701126305,"attachedInfoBytes":"sgJiChHnu6fmib9CZWFuV3JhcHBlchIETWF0aBjJ0wEg1tMBKAE1mDTqOjoHYXJ0aWNsZUDt6Pjd3Y6uXkgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODnyAtUBCiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODkaB2FydGljbGUiCTEwMzAxNDE0OToR57un5om\u002FQmVhbldyYXBwZXJA7ej43d2Orl5INVISYWlfZW50aXR5X3JlY2FsbGVyXZg06jpiYgoR57un5om\u002FQmVhbldyYXBwZXISBE1hdGgYydMBINbTASgBNZg06jo6B2FydGljbGVA7ej43d2Orl5IAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"解析器","mention":"解析器","matchorder":2,"begin":162,"end":165,"entityid":1992201054319189800,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Computer","score":0.001268656157482062,"attachedInfoBytes":"sgJdCgnop6PmnpDlmagSCENvbXB1dGVyGKIBIKUBKAI1CUmmOjoHYXJ0aWNsZUCPveqe3Inu0htIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg58gLJAQokMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5GgdhcnRpY2xlIgkxMDMwMTQxNDk6Ceino+aekOWZqECPveqe3Inu0htINlISYWlfZW50aXR5X3JlY2FsbGVyXQlJpjpiXQoJ6Kej5p6Q5ZmoEghDb21wdXRlchiiASClASgCNQlJpjo6B2FydGljbGVAj73qntyJ7tIbSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OQ==","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"resultset","mention":"resultset","matchorder":1,"begin":24624,"end":24633,"entityid":6987223505202531000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Math","score":0.0009927324729820594,"attachedInfoBytes":"sgJbCglyZXN1bHRzZXQSBE1hdGgYsMABILnAASgBNZMegjo6B2FydGljbGVAtZvtjqHY5vtgSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OfICxwEKJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4ORoHYXJ0aWNsZSIJMTAzMDE0MTQ5OglyZXN1bHRzZXRAtZvtjqHY5vtgSDdSEmFpX2VudGl0eV9yZWNhbGxlcl2THoI6YlsKCXJlc3VsdHNldBIETWF0aBiwwAEgucABKAE1kx6COjoHYXJ0aWNsZUC1m+2Oodjm+2BIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"SQL语句","mention":"SQL语句","matchorder":8,"begin":698,"end":703,"entityid":3675725623633943000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Math","score":0.0008671122522666188,"attachedInfoBytes":"sgJZCglTUUzor63lj6USBE1hdGgYugUgvwUoCDXrTmM6OgdhcnRpY2xlQLS1gsStn7OBM0gAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODnyAsUBCiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODkaB2FydGljbGUiCTEwMzAxNDE0OToJU1FM6K+t5Y+lQLS1gsStn7OBM0g4UhJhaV9lbnRpdHlfcmVjYWxsZXJd605jOmJZCglTUUzor63lj6USBE1hdGgYugUgvwUoCDXrTmM6OgdhcnRpY2xlQLS1gsStn7OBM0gAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODk=","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"默认构造方法","mention":"默认构造方法","matchorder":1,"begin":30454,"end":30460,"entityid":-1804974244063389200,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Unknown","score":0.000693854027320499,"attachedInfoBytes":"sgJoChLpu5jorqTmnoTpgKDmlrnms5USB1Vua25vd24Y9u0BIPztASgBNcHjNTo6B2FydGljbGVAp7T9zs+v3PnmAUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODnyAuMBCiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODkaB2FydGljbGUiCTEwMzAxNDE0OToS6buY6K6k5p6E6YCg5pa55rOVQKe0\u002Fc7Pr9z55gFIOVIXYmFpZHUtYmFpa2UtaXRlbS1yZWNhbGxdweM1OmJoChLpu5jorqTmnoTpgKDmlrnms5USB1Vua25vd24Y9u0BIPztASgBNcHjNTo6B2FydGljbGVAp7T9zs+v3PnmAUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODk=","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"本地机器","mention":"本地机器","matchorder":1,"begin":31979,"end":31983,"entityid":3845301258688219600,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Unknown","score":0.0005594097698174438,"attachedInfoBytes":"sgJhCgzmnKzlnLDmnLrlmagSB1Vua25vd24Y6\u002FkBIO\u002F5ASgBNVulEjo6B2FydGljbGVAiJTl0\u002FGj0K41SABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OfIC1QEKJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4ORoHYXJ0aWNsZSIJMTAzMDE0MTQ5OgzmnKzlnLDmnLrlmahAiJTl0\u002FGj0K41SDpSF2JhaWR1LWJhaWtlLWl0ZW0tcmVjYWxsXVulEjpiYQoM5pys5Zyw5py65ZmoEgdVbmtub3duGOv5ASDv+QEoATVbpRI6OgdhcnRpY2xlQIiU5dPxo9CuNUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODk=","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"delegate.getBindings","mention":"delegate.getBindings","matchorder":3,"begin":6703,"end":6723,"entityid":4362787559733852000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Math","score":0.0032166925054157858,"attachedInfoBytes":"sgJkChRkZWxlZ2F0ZS5nZXRCaW5kaW5ncxIETWF0aBivNCDDNCgDNSXPUjs6B2FydGljbGVAjO63w7qF78U8SABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OfIC2wEKJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4ORoHYXJ0aWNsZSIJMTAzMDE0MTQ5OhRkZWxlZ2F0ZS5nZXRCaW5kaW5nc0CM7rfDuoXvxTxIO1ISYWlfZW50aXR5X3JlY2FsbGVyXSXPUjtiZAoUZGVsZWdhdGUuZ2V0QmluZGluZ3MSBE1hdGgYrzQgwzQoAzUlz1I7OgdhcnRpY2xlQIzut8O6he\u002FFPEgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODk=","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"类型处理器","mention":"类型处理器","matchorder":9,"begin":20524,"end":20529,"entityid":-5311236777045840000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Computer","score":0.0005391530077765916,"attachedInfoBytes":"sgJmCg\u002FnsbvlnovlpITnkIblmagSCENvbXB1dGVyGKygASCxoAEoCTXyVQ06OgdhcnRpY2xlQKLjxNGpyayltgFIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg58gLZAQokMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5GgdhcnRpY2xlIgkxMDMwMTQxNDk6D+exu+Wei+WkhOeQhuWZqECi48TRqcmspbYBSDxSEmFpX2VudGl0eV9yZWNhbGxlcl3yVQ06YmYKD+exu+Wei+WkhOeQhuWZqBIIQ29tcHV0ZXIYrKABILGgASgJNfJVDTo6B2FydGljbGVAouPE0anJrKW2AUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODk=","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"foreach语句","mention":"foreach语句","matchorder":1,"begin":21201,"end":21210,"entityid":-8058075099057612000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Math","score":0.0016157993497505352,"attachedInfoBytes":"sgJgCg1mb3JlYWNo6K+t5Y+lEgRNYXRoGNGlASDapQEoATU7ydM6OgdhcnRpY2xlQLG6gJrB7P2VkAFIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg58gLRAQokMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5GgdhcnRpY2xlIgkxMDMwMTQxNDk6DWZvcmVhY2jor63lj6VAsbqAmsHs\u002FZWQAUg9UhJhaV9lbnRpdHlfcmVjYWxsZXJdO8nTOmJgCg1mb3JlYWNo6K+t5Y+lEgRNYXRoGNGlASDapQEoATU7ydM6OgdhcnRpY2xlQLG6gJrB7P2VkAFIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"method","mention":"method","matchorder":2,"begin":37938,"end":37944,"entityid":-9199641733867006000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Medical","score":0.0011053682595941472,"attachedInfoBytes":"sgJcCgZtZXRob2QSB01lZGljYWwYsqgCILioAigCNQHikDo6B2FydGljbGVA77D+v9vSk6qAAUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODnyAsYBCiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODkaB2FydGljbGUiCTEwMzAxNDE0OToGbWV0aG9kQO+w\u002Fr\u002Fb0pOqgAFIPlISYWlfZW50aXR5X3JlY2FsbGVyXQHikDpiXAoGbWV0aG9kEgdNZWRpY2FsGLKoAiC4qAIoAjUB4pA6OgdhcnRpY2xlQO+w\u002Fr\u002Fb0pOqgAFIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"布尔表达式","mention":"布尔表达式","matchorder":1,"begin":9727,"end":9732,"entityid":-1175589871269569500,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Unknown","score":0.0006637250626775294,"attachedInfoBytes":"sgJjCg\u002FluIPlsJTooajovr7lvI8SB1Vua25vd24Y\u002F0sghEwoATXW\u002FS06OgdhcnRpY2xlQJa4uMvZ593X7wFIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg58gLbAQokMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5GgdhcnRpY2xlIgkxMDMwMTQxNDk6D+W4g+WwlOihqOi+vuW8j0CWuLjL2efd1+8BSD9SF2JhaWR1LWJhaWtlLWl0ZW0tcmVjYWxsXdb9LTpiYwoP5biD5bCU6KGo6L6+5byPEgdVbmtub3duGP9LIIRMKAE11v0tOjoHYXJ0aWNsZUCWuLjL2efd1+8BSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OQ==","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"继承MapWrapper","mention":"继承MapWrapper","matchorder":1,"begin":27121,"end":27133,"entityid":4847201612854964000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Math","score":0.0016552977342557812,"attachedInfoBytes":"sgJiChDnu6fmib9NYXBXcmFwcGVyEgRNYXRoGPHTASD90wEoATWT9tg6OgdhcnRpY2xlQPLjrof3ha6iQ0gAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODnyAtUBCiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODkaB2FydGljbGUiCTEwMzAxNDE0OToQ57un5om\u002FTWFwV3JhcHBlckDy466H94WuokNIQFISYWlfZW50aXR5X3JlY2FsbGVyXZP22DpiYgoQ57un5om\u002FTWFwV3JhcHBlchIETWF0aBjx0wEg\u002FdMBKAE1k\u002FbYOjoHYXJ0aWNsZUDy466H94WuokNIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"动态SQL语句","mention":"动态SQL语句","matchorder":1,"begin":1355,"end":1362,"entityid":4866503919339129000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Math","score":0.0012431426457736108,"attachedInfoBytes":"sgJfCg\u002FliqjmgIFTUUzor63lj6USBE1hdGgYywog0gooATXy8KI6OgdhcnRpY2xlQJqOhZL+8NLEQ0gAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODnyAtEBCiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODkaB2FydGljbGUiCTEwMzAxNDE0OToP5Yqo5oCBU1FM6K+t5Y+lQJqOhZL+8NLEQ0hBUhJhaV9lbnRpdHlfcmVjYWxsZXJd8vCiOmJfCg\u002FliqjmgIFTUUzor63lj6USBE1hdGgYywog0gooATXy8KI6OgdhcnRpY2xlQJqOhZL+8NLEQ0gAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODk=","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"解析类","mention":"解析类","matchorder":1,"begin":20153,"end":20156,"entityid":-5923797433243182000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Math","score":0.0010866552275241859,"attachedInfoBytes":"sgJcCgnop6PmnpDnsbsSBE1hdGgYuZ0BILydASgBNRlujjo6B2FydGljbGVAnLat8euznOWtAUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODnyAskBCiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODkaB2FydGljbGUiCTEwMzAxNDE0OToJ6Kej5p6Q57G7QJy2rfHrs5zlrQFIQlISYWlfZW50aXR5X3JlY2FsbGVyXRlujjpiXAoJ6Kej5p6Q57G7EgRNYXRoGLmdASC8nQEoATUZbo46OgdhcnRpY2xlQJy2rfHrs5zlrQFIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"内置类型","mention":"内置类型","matchorder":1,"begin":22157,"end":22161,"entityid":-7603447469398232000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Unknown","score":0.0005656549035523055,"attachedInfoBytes":"sgJiCgzlhoXnva7nsbvlnosSB1Vua25vd24Yja0BIJGtASgBNXVIFDo6B2FydGljbGVAs+izsfuZyL2WAUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODnyAt8BCiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODkaB2FydGljbGUiCTEwMzAxNDE0OToM5YaF572u57G75Z6LQLPos7H7mci9lgFIQ1IfbmV3X2JhaWR1LXdpa2lwZWRpYS1pdGVtLXJlY2FsbF11SBQ6YmIKDOWGhee9ruexu+WeixIHVW5rbm93bhiNrQEgka0BKAE1dUgUOjoHYXJ0aWNsZUCz6LOx+5nIvZYBSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OQ==","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"返回值","mention":"返回值","matchorder":1,"begin":9737,"end":9740,"entityid":-7031970680018555000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Unknown","score":0.0005410599864199232,"attachedInfoBytes":"sgJdCgnov5Tlm57lgLwSB1Vua25vd24YiUwgjEwoATXs1Q06OgdhcnRpY2xlQMffoNTG\u002Fdq0ngFIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg58gLPAQokMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5GgdhcnRpY2xlIgkxMDMwMTQxNDk6Cei\u002FlOWbnuWAvEDH36DUxv3atJ4BSERSF2JhaWR1LWJhaWtlLWl0ZW0tcmVjYWxsXezVDTpiXQoJ6L+U5Zue5YC8EgdVbmtub3duGIlMIIxMKAE17NUNOjoHYXJ0aWNsZUDH36DUxv3atJ4BSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OQ==","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"条目处理","mention":"条目处理","matchorder":2,"begin":4525,"end":4529,"entityid":4535590974822186000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Computer","score":0.0005072304843293399,"attachedInfoBytes":"sgJgCgzmnaHnm67lpITnkIYSCENvbXB1dGVyGK0jILEjKAI1qfcEOjoHYXJ0aWNsZUD79vml4P7p+D5IAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg58gLPAQokMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5GgdhcnRpY2xlIgkxMDMwMTQxNDk6DOadoeebruWkhOeQhkD79vml4P7p+D5IRVISYWlfZW50aXR5X3JlY2FsbGVyXan3BDpiYAoM5p2h55uu5aSE55CGEghDb21wdXRlchitIyCxIygCNan3BDo6B2FydGljbGVA+\u002Fb5peD+6fg+SABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OQ==","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"DefaultObjectFactory类","mention":"DefaultObjectFactory类","matchorder":1,"begin":31913,"end":31934,"entityid":-208492304199641400,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Math","score":0.0027906281265294153,"attachedInfoBytes":"sgJqChdEZWZhdWx0T2JqZWN0RmFjdG9yeeexuxIETWF0aBip+QEgvvkBKAE1+eI2OzoHYXJ0aWNsZUDIrZzuqavSjf0BSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OfIC5QEKJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4ORoHYXJ0aWNsZSIJMTAzMDE0MTQ5OhdEZWZhdWx0T2JqZWN0RmFjdG9yeeexu0DIrZzuqavSjf0BSEZSEmFpX2VudGl0eV9yZWNhbGxlcl354jY7YmoKF0RlZmF1bHRPYmplY3RGYWN0b3J557G7EgRNYXRoGKn5ASC++QEoATX54jY7OgdhcnRpY2xlQMitnO6pq9KN\u002FQFIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"delegate.appendSql","mention":"delegate.appendSql","matchorder":3,"begin":7670,"end":7688,"entityid":5574287353240129000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Math","score":0.0021568774740104713,"attachedInfoBytes":"sgJiChJkZWxlZ2F0ZS5hcHBlbmRTcWwSBE1hdGgY9jsgiDwoAzVmWg07OgdhcnRpY2xlQPiY0u6FmvatTUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODnyAtcBCiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODkaB2FydGljbGUiCTEwMzAxNDE0OToSZGVsZWdhdGUuYXBwZW5kU3FsQPiY0u6FmvatTUhHUhJhaV9lbnRpdHlfcmVjYWxsZXJdZloNO2JiChJkZWxlZ2F0ZS5hcHBlbmRTcWwSBE1hdGgY9jsgiDwoAzVmWg07OgdhcnRpY2xlQPiY0u6FmvatTUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODk=","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"循环表达式","mention":"循环表达式","matchorder":1,"begin":10139,"end":10144,"entityid":4917051303181317000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Computer","score":0.0008238275051460284,"attachedInfoBytes":"sgJjCg\u002Flvqrnjq\u002Fooajovr7lvI8SCENvbXB1dGVyGJtPIKBPKAE1IfZXOjoHYXJ0aWNsZUCM6PnjvIO4nkRIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg58gLVAQokMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5GgdhcnRpY2xlIgkxMDMwMTQxNDk6D+W+queOr+ihqOi+vuW8j0CM6PnjvIO4nkRISVISYWlfZW50aXR5X3JlY2FsbGVyXSH2VzpiYwoP5b6q546v6KGo6L6+5byPEghDb21wdXRlchibTyCgTygBNSH2Vzo6B2FydGljbGVAjOj547yDuJ5ESABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OQ==","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"继承BaseTypeHandler","mention":"继承BaseTypeHandler","matchorder":1,"begin":22926,"end":22943,"entityid":-1008718547329980500,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Math","score":0.0025344484304210546,"attachedInfoBytes":"sgJoChXnu6fmib9CYXNlVHlwZUhhbmRsZXISBE1hdGgYjrMBIJ+zASgBNf0YJjs6B2FydGljbGVAhM+x4LX6k4DyAUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODnyAuEBCiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODkaB2FydGljbGUiCTEwMzAxNDE0OToV57un5om\u002FQmFzZVR5cGVIYW5kbGVyQITPseC1+pOA8gFISlISYWlfZW50aXR5X3JlY2FsbGVyXf0YJjtiaAoV57un5om\u002FQmFzZVR5cGVIYW5kbGVyEgRNYXRoGI6zASCfswEoATX9GCY7OgdhcnRpY2xlQITPseC1+pOA8gFIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"解析Mapper","mention":"解析Mapper","matchorder":1,"begin":20845,"end":20853,"entityid":-5671703517150089000,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Math","score":0.002150597612064764,"attachedInfoBytes":"sgJfCgzop6PmnpBNYXBwZXISBE1hdGgY7aIBIPWiASgBNQrxDDs6B2FydGljbGVAzeG957f2g6WxAUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODnyAs8BCiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODkaB2FydGljbGUiCTEwMzAxNDE0OToM6Kej5p6QTWFwcGVyQM3hvee39oOlsQFIS1ISYWlfZW50aXR5X3JlY2FsbGVyXQrxDDtiXwoM6Kej5p6QTWFwcGVyEgRNYXRoGO2iASD1ogEoATUK8Qw7OgdhcnRpY2xlQM3hvee39oOlsQFIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"attribute","mention":"attribute","matchorder":1,"begin":37983,"end":37992,"entityid":-1414854761767858700,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Medical","score":0.0018757066617723916,"attachedInfoBytes":"sgJfCglhdHRyaWJ1dGUSB01lZGljYWwY36gCIOioAigBNUba9To6B2FydGljbGVA45u6oPKi267sAUgAUiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODnyAswBCiQxMTc0YjdhZi0wZWI3LTQyY2UtOTEwYS1hOTAyZTVmNjRjODkaB2FydGljbGUiCTEwMzAxNDE0OToJYXR0cmlidXRlQOObuqDyotuu7AFITFISYWlfZW50aXR5X3JlY2FsbGVyXUba9TpiXwoJYXR0cmlidXRlEgdNZWRpY2FsGN+oAiDoqAIoATVG2vU6OgdhcnRpY2xlQOObuqDyotuu7AFIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"元数据","mention":"元数据","matchorder":1,"begin":30040,"end":30043,"entityid":1035423285614959700,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Unknown","score":0.0008063914480578435,"attachedInfoBytes":"sgJeCgnlhYPmlbDmja4SB1Vua25vd24Y2OoBINvqASgBNQRkUzo6B2FydGljbGVAgLn92eD\u002Fo68OSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OfIC1wEKJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4ORoHYXJ0aWNsZSIJMTAzMDE0MTQ5OgnlhYPmlbDmja5AgLn92eD\u002Fo68OSE1SH25ld19iYWlkdS13aWtpcGVkaWEtaXRlbS1yZWNhbGxdBGRTOmJeCgnlhYPmlbDmja4SB1Vua25vd24Y2OoBINvqASgBNQRkUzo6B2FydGljbGVAgLn92eD\u002Fo68OSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OQ==","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"解析SQL节点","mention":"解析SQL节点","matchorder":1,"begin":1373,"end":1380,"entityid":1497171270905421800,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Computer","score":0.0016743162653875127,"attachedInfoBytes":"sgJjCg\u002Fop6PmnpBTUUzoioLngrkSCENvbXB1dGVyGN0KIOQKKAE1u3TbOjoHYXJ0aWNsZUD2v\u002FPR6qrB4xRIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg58gLVAQokMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5GgdhcnRpY2xlIgkxMDMwMTQxNDk6D+ino+aekFNRTOiKgueCuUD2v\u002FPR6qrB4xRITlISYWlfZW50aXR5X3JlY2FsbGVyXbt02zpiYwoP6Kej5p6QU1FM6IqC54K5EghDb21wdXRlchjdCiDkCigBNbt02zo6B2FydGljbGVA9r\u002Fz0eqqweMUSABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OQ==","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""},{"name":"指定属性","mention":"指定属性","matchorder":2,"begin":30111,"end":30115,"entityid":3632507551715532300,"isBookMark":false,"link":{"linkType":0,"linkUrl":"","docType":"","topicToken":""},"entityClass":"Math","score":0.0005135092622521572,"attachedInfoBytes":"sgJeCgzmjIflrprlsZ7mgKcSBE1hdGgYn+sBIKPrASgCNQadBjo6B2FydGljbGVApbq2v\u002FXL0LQySABSJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4OfICzQEKJDExNzRiN2FmLTBlYjctNDJjZS05MTBhLWE5MDJlNWY2NGM4ORoHYXJ0aWNsZSIJMTAzMDE0MTQ5OgzmjIflrprlsZ7mgKdApbq2v\u002FXL0LQySE9SEmFpX2VudGl0eV9yZWNhbGxlcl0GnQY6Yl4KDOaMh+WumuWxnuaApxIETWF0aBif6wEgo+sBKAI1Bp0GOjoHYXJ0aWNsZUClura\u002F9cvQtDJIAFIkMTE3NGI3YWYtMGViNy00MmNlLTkxMGEtYTkwMmU1ZjY0Yzg5","isOnAB":false,"isNatural":1,"isDelete":false,"contentType":"","contentId":"","contentToken":""}]}},"columns":{"c_1101164296519720960":{"description":"","canManage":false,"intro":"","isFollowing":false,"urlToken":"c_1101164296519720960","id":"c_1101164296519720960","articlesCount":169,"acceptSubmission":true,"title":"JAVA CTO之旅","url":"https:\u002F\u002Fzhuanlan.zhihu.com\u002Fc_1101164296519720960","commentPermission":"all","created":1555318026,"updated":1599163442,"imageUrl":"https:\u002F\u002Fpica.zhimg.com\u002F4b70deef7_720w.jpg?source=172ae18b","author":{"isFollowed":false,"avatarUrlTemplate":"https:\u002F\u002Fpic1.zhimg.com\u002Fv2-2856788095527eadbbc0dd5d521840f0.jpg?source=172ae18b","uid":"1065361307078983680","userType":"people","isFollowing":false,"urlToken":"yong-heng-zhi-hun","id":"f5930745493d322ed5f4c7af691e5e8d","description":"注重底层，第一性原理思考。","name":"永恒之魂","isAdvertiser":false,"headline":"道可道，非常道。","gender":1,"url":"\u002Fpeople\u002Ff5930745493d322ed5f4c7af691e5e8d","avatarUrl":"https:\u002F\u002Fpica.zhimg.com\u002Fv2-2856788095527eadbbc0dd5d521840f0_l.jpg?source=172ae18b","isOrg":false,"type":"people","badgeV2":{"title":"","mergedBadges":[],"detailBadges":[],"icon":"","nightIcon":""}},"followers":1039,"type":"column"}},"topics":{},"roundtables":{},"favlists":{},"comments":{},"notifications":{},"ebooks":{},"activities":{},"feeds":{},"pins":{},"promotions":{},"drafts":{},"chats":{},"posts":{},"zvideos":{},"zvideoContributions":{},"briefs":{},"eduCourses":{}},"currentUser":"","account":{"unlockTicketStatus":false,"unlockTicket":null,"challenge":[],"errorStatus":false,"message":"","isFetching":false,"accountInfo":{},"urlToken":{"loading":false},"cardUserInfo":{"vipInfo":{}},"handleWidget":{},"widgetList":[],"userWidgetId":""},"settings":{"socialBind":null,"inboxMsg":null,"notification":{},"email":{},"privacyFlag":null,"blockedUsers":{"isFetching":false,"paging":{"pageNo":1,"pageSize":6},"data":[]},"blockedFollowees":{"isFetching":false,"paging":{"pageNo":1,"pageSize":6},"data":[]},"ignoredTopics":{"isFetching":false,"paging":{"pageNo":1,"pageSize":6},"data":[]},"restrictedTopics":null,"laboratory":{}},"notification":{},"people":{"profileStatus":{},"activitiesByUser":{},"answersByUser":{},"answersSortByVotesByUser":{},"answersIncludedByUser":{},"votedAnswersByUser":{},"thankedAnswersByUser":{},"voteAnswersByUser":{},"thankAnswersByUser":{},"topicAnswersByUser":{},"zvideosByUser":{},"articlesByUser":{},"articlesSortByVotesByUser":{},"articlesIncludedByUser":{},"pinsByUser":{},"questionsByUser":{},"commercialQuestionsByUser":{},"favlistsByUser":{},"followingByUser":{},"followersByUser":{},"mutualsByUser":{},"followingColumnsByUser":{},"followingQuestionsByUser":{},"followingFavlistsByUser":{},"followingTopicsByUser":{},"publicationsByUser":{},"columnsByUser":{},"allFavlistsByUser":{},"brands":null,"creationsByUser":{},"creationsSortByVotesByUser":{},"creationsFeed":{},"infinity":{},"batchUsers":{},"profileInfinity":null},"env":{"ab":{"config":{},"triggers":{}},"abV2":{"config":{"paramMap":{"ws_platform_new":{"value":"0"},"pc_mou_cre_remove":{"value":"0"},"ws_publish_answer":{"value":"0"},"ws_pin_contentpub":{"value":"1"},"in_editor_title":{"value":"0"}},"abMap":{}},"triggers":{}},"userAgent":{"Edge":false,"IE":false,"Wechat":false,"Weibo":false,"QQ":false,"MQQBrowser":false,"Qzone":false,"Mobile":false,"Android":false,"iOS":false,"isAppleDevice":false,"Zhihu":false,"ZhihuHybrid":false,"isBot":false,"Tablet":false,"UC":false,"Quark":false,"Sogou":false,"Qihoo":false,"Baidu":false,"BaiduApp":false,"Safari":false,"GoogleBot":false,"AndroidDaily":false,"iOSDaily":false,"WxMiniProgram":false,"BaiduMiniProgram":false,"QQMiniProgram":false,"JDMiniProgram":false,"isWebView":false,"isMiniProgram":false,"origin":"Mozilla\u002F5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\u002F537.36 (KHTML, like Gecko) Chrome\u002F119.0.0.0 Safari\u002F537.36"},"appViewConfig":{},"ctx":{"path":"\u002Fp\u002F66984738","query":{"utm_id":"0"},"href":"http:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F66984738?utm_id=0","host":"zhuanlan.zhihu.com"},"trafficSource":"production","edition":{"beijing":false,"baidu":true,"sogou":false,"baiduBeijing":false,"sogouBeijing":false,"sogouInput":false,"oppoSearch":false,"baiduSearch":true,"googleSearch":false,"shenma":false,"miniProgram":false,"xiaomi":false,"huaweiSearch":false},"theme":"light","appHeaderTheme":{"current":"normal","disable":true,"normal":{"bgColor":"GBK99A"},"custom":{"bgColor":"GBK99A"}},"enableShortcut":true,"referer":"https:\u002F\u002Fwww.baidu.com\u002Flink?url=_mcdalcrMa0_rMzxqYPvA_1NPKXT_gkUft8emqkbYgvJLCwZhWEE6BZSkoeFDigN10nyOyMhlRBfjsiJr6PJ1q&wd=&eqid=f98888b80031d623000000036559e8d1","xUDId":"AOCSOWpQqRePTiWi0LF7nNiqvaTw0_hfi-I=","mode":"ssr","conf":{},"xTrafficFreeOrigin":"","ipInfo":{"cityName":"成都","countryName":"中国","regionName":"四川","countryCode":"CN"},"logged":false,"vars":{"passThroughHeaders":{}}},"me":{"columnContributions":[]},"label":{},"ecommerce":{},"comments":{"pagination":{},"collapsed":{},"reverse":{},"reviewing":{},"conversation":{},"parent":{}},"commentsV2":{"stickers":[],"commentWithPicPermission":{},"notificationsComments":{},"pagination":{},"collapsed":{},"reverse":{},"reviewing":{},"conversation":{},"conversationMore":{},"parent":{}},"pushNotifications":{"default":{"isFetching":false,"isDrained":false,"ids":[]},"follow":{"isFetching":false,"isDrained":false,"ids":[]},"vote_thank":{"isFetching":false,"isDrained":false,"ids":[]},"currentTab":"default","notificationsCount":{"default":0,"follow":0,"vote_thank":0}},"messages":{"data":{},"currentTab":"common","messageCount":0},"register":{"registerValidateSucceeded":null,"registerValidateErrors":{},"registerConfirmError":null,"sendDigitsError":null,"registerConfirmSucceeded":null},"login":{"loginUnregisteredError":false,"loginBindWechatError":false,"loginConfirmError":null,"sendDigitsError":null,"needSMSIdentify":false,"validateDigitsError":false,"loginConfirmSucceeded":null,"qrcodeLoginToken":"","qrcodeLoginScanStatus":0,"qrcodeLoginError":null,"qrcodeLoginReturnNewToken":false},"switches":{},"captcha":{"captchaNeeded":false,"captchaValidated":false},"sms":{"supportedCountries":[]},"chat":{"chats":{},"inbox":{"recents":{"isFetching":false,"isDrained":false,"isPrevDrained":false,"result":[],"next":null,"key":null},"strangers":{"isFetching":false,"isDrained":false,"isPrevDrained":false,"result":[],"next":null,"key":null},"friends":{"isFetching":false,"isDrained":false,"isPrevDrained":false,"result":[],"next":null,"key":null},"search":{"isFetching":false,"isDrained":false,"isPrevDrained":false,"result":[],"next":null,"key":null},"config":{"newCount":0,"strangerMessageSwitch":false,"strangerMessageUnread":false,"friendCount":0}},"global":{"isChatMqttExisted":false}},"emoticons":{"emoticonGroupList":[],"emoticonGroupDetail":{}},"creator":{"tools":{"question":{"invitationCount":{"questionFolloweeCount":0,"questionTotalCount":0}},"recommend":{"recommendTimes":{}}},"explore":{},"levelUpperLimit":10,"mcn":{},"mcnManage":{},"tasks":{},"announcement":{},"creatorsRecommendInfo":{}},"creators":{"common":{"applyStatus":{},"rightsStatus":{}},"bayesDomains":{"status":{},"options":{"topDomains":null,"allDomains":null,"editable":0},"contents":null},"school":{"tabs":[],"contents":[],"banner":null,"entities":{}},"faq":{"tabs":[],"article":{}},"knowledgeIncome":{},"safeguardRights":{},"analytics":{"all":{},"answer":{},"zvideo":{},"article":{},"pin":{},"singleContent":{}},"account":{"growthLevel":{}},"KMResource":{},"training":{},"ToolsQuestion":{"goodatTopics":[]},"ToolsHotspot":{"domains":[]},"ToolsRecommend":{},"ToolsCustomPromotion":{"itemLists":{},"baseInfo":{}},"ToolsSearchQuestion":{},"editorSetting":{},"MCNManage":{},"knowledgeTasks":{},"incomeAnalysis":{"income":{"aggregation":{}}},"creationManage":{"editModal":{"status":false}},"activity":{},"announcement":{},"home":{"currentCreatorUrlToken":null,"rights":[],"newRights":[],"scoreInfo":{},"menusShowControlByServer":{"bVipRecomend":false,"creationRelationship":false},"newTasks":{"creatorTask":{"tasks":[],"des":[]}},"bannerList":[],"recentlyCreated":[],"homecard":{}},"videoSupport":{"textBenefit":{}},"videoDistribution":{},"profilePoster":{"creatorPosterConfig":{},"creatorPosterData":{}}},"answers":{"voters":{},"copyrightApplicants":{},"favlists":{},"newAnswer":{},"entityWords":{},"paidContent":{},"settings":{},"relationEndorsement":{}},"recommendation":{"homeRecommendations":[]},"shareTexts":{},"articles":{"voters":{},"relationEndorsement":{}},"previewPost":{},"favlists":{"relations":{}},"columns":{"voters":{}},"reward":{"answer":{},"article":{},"question":{}},"video":{"data":{},"shareVideoDetail":{},"last":{}},"topstory":{"recommend":{"isFetching":false,"isDrained":false,"afterId":0,"items":[],"next":null},"follow":{"isFetching":false,"isDrained":false,"afterId":0,"items":[],"next":null},"followWonderful":{"isFetching":false,"isDrained":false,"afterId":0,"items":[],"next":null},"sidebar":null,"announcement":{},"hotList":[],"hotListHeadZone":[],"guestFeeds":{"isFetching":false,"isDrained":false,"afterId":0,"items":[],"next":null},"followExtra":{"isNewUser":null,"isFetched":false,"followCount":0,"followers":[]},"hotDaily":{"data":[],"paging":{}},"hotHighlight":{"isFetching":false,"isDrained":false,"data":[],"paging":{}},"banner":{},"commercialBanner":{"show":false,"banner":{},"trackData":{}},"video":{"items":[],"next":null,"isLoading":false,"isDrained":false}},"readStatus":{},"column":{},"requestColumn":{"categories":[],"error":null},"articleContribution":{"contributeRequests":[],"deleteContributeIdList":[],"handledContributeIdList":[],"recommendedColumns":[],"pinnedColumns":[],"sentContributeRequestsIdList":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"c_1101164296519720960",null]},"columnContribution":{"contributeRequests":[],"autoInviteEnabled":false,"recommendedContributors":[]},"draftHistory":{"history":{},"drafts":{}},"upload":{},"articleDraft":{"titleImage":"","titleImageSize":{},"isTitleImageFullScreen":false,"canTitleImageFullScreen":false,"title":"","titleImageUploading":false,"error":"","content":"","draftLoading":false,"updating":false,"globalLoading":false,"pendingVideo":{"resource":null,"error":null},"deleteFail":{"fail":false},"recommendTopics":[],"selectedColumn":0,"articleDisclaimers":[]},"articleDrafts":{"isDrained":false,"isLoading":false,"items":[]},"columnAutocomplete":{"users":[],"friends":[]},"columnCollection":{},"userProfit":{"permission":{"permissionStatus":{"zhiZixuan":0,"recommend":-1,"task":0,"plugin":0,"infinity":0},"visible":false},"linkCardLimit":0},"mcn":{"bindInfo":{},"memberCategoryList":[],"producerList":[],"categoryList":[],"lists":{},"banners":{},"protocolStatus":{"isAgreedNew":true,"isAgreedOld":true},"probationCountdownDays":0},"zvideos":{"campaignVideoList":{},"campaigns":{},"tagoreCategory":[],"recommendations":{},"insertable":{},"recruit":{"form":{"platform":"","nickname":"","followerCount":"","domain":"","contact":""},"submited":false,"ranking":[]},"qyActivityData":{},"talkActivityData":{},"party2022ActivityData":{},"batchVideos":{},"contribution":{"selectedContribution":null,"campaign":null,"configs":{},"contributionLists":{},"recommendQuestions":{"isLoading":true,"paging":{"isEnd":false,"isStart":true,"totals":0},"data":[]},"questionSearchResults":{"isLoading":true,"paging":{"isEnd":false,"isStart":true,"totals":0},"data":[]}},"creationReferences":{},"zvideoCollection":{},"zvideoGrant":{},"collectData":{"isFetching":false,"list":[]},"videoSource":{"isLoaded":false}},"republish":{},"commentPermission":{},"creatorRightStatus":{"list":[]},"adPromotion":{"answer":{},"article":{}}},"fetchHost":"www.zhihu.com","subAppName":"column","spanName":"Post","canaryConfig":{"test_canary":"0","use_new_player":"0","player_vendor":"0","use_hevc":"1","upload_use_signature":"1","use_backdrop_blur":"1","article_title_imagex":"1","play_station":"1","use_cached_supported_countries":"1"}}

</script>
<script crossorigin="" src="./mybatis 3.x源码深度解析（五） - 知乎_files/vendor.5f3e51e68d56265eb628.js.下载"></script>
<script crossorigin="" src="./mybatis 3.x源码深度解析（五） - 知乎_files/react.production.min.js.下载"></script>
<script crossorigin="" src="./mybatis 3.x源码深度解析（五） - 知乎_files/react-dom.production.min.js.下载"></script>
<script crossorigin="" src="./mybatis 3.x源码深度解析（五） - 知乎_files/react-dom-server.browser.production.min.js.下载"></script>
<script crossorigin="" src="./mybatis 3.x源码深度解析（五） - 知乎_files/runtime.app.59caa3a8fe5130ddbb63.js.下载"></script>
<script crossorigin="" src="./mybatis 3.x源码深度解析（五） - 知乎_files/lib-75fc9c18.app.3db651c252e14ef6658e.js.下载"></script>
<script crossorigin="" src="./mybatis 3.x源码深度解析（五） - 知乎_files/lib-29107295.app.42d07f814b7b05187671.js.下载"></script>
<script crossorigin="" src="./mybatis 3.x源码深度解析（五） - 知乎_files/lib-79b5cf47.app.8b6b6bf4b6d894db9b07.js.下载"></script>
<script crossorigin="" src="./mybatis 3.x源码深度解析（五） - 知乎_files/lib-330004dc.app.7437cf54ac28fca0e302.js.下载"></script>
<script crossorigin="" src="./mybatis 3.x源码深度解析（五） - 知乎_files/lib-0e5ce61e.app.bfc97c459473d6bbad05.js.下载"></script>
<script crossorigin="" src="./mybatis 3.x源码深度解析（五） - 知乎_files/lib-83b0f42f.app.6bcd41e130a7cc845dab.js.下载"></script>
<script crossorigin="" src="./mybatis 3.x源码深度解析（五） - 知乎_files/lib-38cf5c11.app.a59df9edceb3cc75ed79.js.下载"></script>
<script crossorigin="" src="./mybatis 3.x源码深度解析（五） - 知乎_files/lib-2ec050f6.app.66b819dce9851a3cd511.js.下载"></script>
<script crossorigin="" src="./mybatis 3.x源码深度解析（五） - 知乎_files/3978.app.a2727e55b27563042207.js.下载"></script>
<script crossorigin="" src="./mybatis 3.x源码深度解析（五） - 知乎_files/column.app.e5fdad4ad929852e3e32.js.下载"></script>
<script defer="" id="ariascripts" loaddata="false" src="./mybatis 3.x源码深度解析（五） - 知乎_files/aria.js.下载" wapforceoldfixed="false"></script>
<script async="" src="./mybatis 3.x源码深度解析（五） - 知乎_files/hm.js.下载"></script>
<script crossorigin="" src="./mybatis 3.x源码深度解析（五） - 知乎_files/zap.js.下载"></script>
<div>
    <div style="display: none;"><i>想来知乎工作？请发送邮件到 jobs@zhihu.com</i></div>
</div>
<script src="./mybatis 3.x源码深度解析（五） - 知乎_files/push.js.下载"></script>
<div>
    <div>
        <div class="css-8pdeid"></div>
    </div>
</div>
<script crossorigin="" src="./mybatis 3.x源码深度解析（五） - 知乎_files/emoticon.js.下载"></script>
<div>
    <div>
        <div class="Editable-languageSuggestions" style="left: -1179px; top: -999px;">
            <div>
                <div class="Popover"><label class="Editable-languageSuggestionsInput Input-wrapper"><input aria-activedescendant="AutoComplete5-0" aria-autocomplete="list" aria-expanded="false" aria-haspopup="true" aria-owns="Popover4-content" autocomplete="off" class="Input" id="Popover4-toggle" placeholder="选择语言" role="combobox" value="">
                    <svg class="Zi Zi--Select" fill="#afbdcf" height="24" viewBox="0 0 24 24" width="24">
                        <path clip-rule="evenodd" d="M12.53 3.47a.75.75 0 0 0-1.06 0l-5 5a.75.75 0 0 0 1.06 1.06L12 5.06l4.47 4.47a.75.75 0 1 0 1.06-1.06l-5-5Zm-5 11a.75.75 0 0 0-1.06 1.06l5 5a.75.75 0 0 0 1.06 0l5-5a.75.75 0 1 0-1.06-1.06L12 18.94l-4.47-4.47Z" fill-rule="evenodd"></path>
                    </svg>
                </label></div>
            </div>
        </div>
    </div>
</div>
<script crossorigin="" src="./mybatis 3.x源码深度解析（五） - 知乎_files/load.min.js.下载"></script>
<script crossorigin="" src="./mybatis 3.x源码深度解析（五） - 知乎_files/js"></script>
<div>
    <div>
        <div class="css-1wq6v87" style="transform-origin: center bottom; margin-top: -6px; opacity: 1; transform: none;">
            <div class="css-nk32ej">
                <div class="css-zr60jh">
                    <svg class="ZDI ZDI--Xmark16 css-1rgloxd" fill="currentColor" height="12" viewBox="0 0 16 16" width="12">
                        <path clip-rule="evenodd" d="M13.46 3.46a.65.65 0 1 0-.92-.92L8 7.08 3.46 2.54a.65.65 0 0 0-.92.92L7.08 8l-4.54 4.54a.65.65 0 1 0 .92.92L8 8.92l4.54 4.54a.65.65 0 1 0 .92-.92L8.92 8l4.54-4.54Z" fill-rule="evenodd"></path>
                    </svg>
                    <img class="css-13lyhea" src="./mybatis 3.x源码深度解析（五） - 知乎_files/liukanshan-peek.a71ecf3e.png"><span class="css-d45dic">登录即可查看<span class="css-n6r743"> 超5亿 </span>专业优质内容</span>
                    <div class="css-1px9tuo">超 5 千万创作者的优质提问、专业回答、深度文章和精彩视频尽在知乎。</div>
                    <button class="Button Button--primary Button--blue css-1qmwpsz" type="button">立即登录/注册</button>
                </div>
            </div>
        </div>
    </div>
</div>
</body>
</html>